我正在尝试获取两个字符串之间的特定数据,这两个字符串是一个开始和结束标记。通常我只是使用XmlParse来解析它,但是问题在于它在数据集中还有很多其他垃圾。
这是大字符串的示例:
test of data need to parse:<?xml version="1.0" encoding="UTF-8"?><alert xmlns="urn:oasis:names:tc::cap:1.2"><identifier>_2020-12-16T17:32:5620201116173256</identifier><sender>683</sender><sent>2020-12-16T17:32:56-05:00</sent><status>Test</status><msgType>Alert</msgType><source>test of data need to parse</source><scope>Public</scope><addresses/><code>Test1.0</code><note>WENS IPAWS</note><info><language>en-US</language></info>
<capsig:Signature xmlns:capsig="http://www.w3.org/2000/09/xmldsig">
<capsig:Info>
<capsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n"/>
<capsig:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-morersa-sha256"/>
<capsig:Referrer URI="">
<capsig:Trans>
<capsig:Trans Algorithm="http://www.w3.org/2000/09/xmldsigenveloped-signature"/>
</capsig:Trans>
<capsig:DMethod Algorithm="http://www.w3.org/2001/04/xmlencsha256"/>
<capsig:DigestValue>wjL4tqltJY7m/4=</capsig:DigestValue>
</capsig:Referrer>
</capsig:Info>
test of data need to parse:<?xml version="1.0" encoding="UTF-8"?><alert xmlns="urn:oasis:names:tc::cap:1.2"><identifier>_2020-12-16T17:32:5620201116173256</identifier><sender>683</sender><sent>2020-12-16T17:32:56-05:00</sent><status>Test</status><msgType>Alert</msgType><source>test of data need to parse</source><scope>Public</scope><addresses/><code>Test1.0</code><note>WENS IPAWS</note><info><language>en-US</language></info>
因此,我需要做的只是提取以下内容:
<capsig:Info>
<capsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n"/>
<capsig:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-morersa-sha256"/>
<capsig:Referrer URL="">
<capsig:Trans>
<capsig:Trans Algorithm="http://www.w3.org/2000/09/xmldsigenveloped-signature"/>
</capsig:Trans>
<capsig:DMethod Algorithm="http://www.w3.org/2001/04/xmlencsha256"/>
<capsig:DigestValue>wjL4tqltJY7m/4=</capsig:DigestValue>
</capsig:Referrer>
</capsig:Info>
我到处搜索,发现可以用字符和计数完成操作,但没有一个真正起作用。尝试使用SQL进行此操作,但是因为字符串中的不断变化会导致问题。所以我的计划是获取“ capsig:Info”之后和“ </ capsig:Info>”之前的所有内容,然后将其插入表中。
有办法用Coldfusion做到这一点吗?
任何建议,将不胜感激。
谢谢!
是的,你可以<capsig:Info> ... </capsig:Info>
通过使用ColdFusion函数使用正则表达式匹配来提取包含标签之间文本的子字符串,该函数reMatch()
将返回与指定模式匹配的所有子字符串的数组。可以使用下面的代码行来完成。
<!--- Use reMatch to extract all pattern matches into an array --->
<cfset parsedXml = reMatch("<capsig:Info>(.*?)</capsig:Info>", xmlToParse)>
<!--- parsedXml is an array of strings. The result will be found in the first array element as such --->
<cfdump var="#parsedXml[1]#" label="parsedXml">
你可以在此处使用演示查看。
https://trycf.com/gist/00be732d93ef49b2427768e18e371527/lucee5?theme=monokai
非常感谢。似乎正在工作。但是,当我尝试输出#parsedXml#并得到以下信息时:复杂的对象类型无法转换为简单的值。表达式已请求将变量或中间表达式结果作为简单值。但是,结果无法转换为简单值。简单值是字符串,数字,布尔值和日期/时间值。查询,数组和COM对象是复杂值的示例。<p>最可能的错误原因是您尝试将复杂值用作简单值。知道会导致什么吗?非常感谢!
发现...我应该看过您提供的示例。我试图cfset它,然后输出它。
使用了您的建议,效果很好。你是国王!非常感谢。。。真的很感激!
@Scott是的,我将编辑我的答案以反映parsedXml是一个复杂的对象。也就是说,它是一个字符串数组,结果出现在第一个数组元素中。我将这样做是为了防止将来与主意的链接断开时造成任何混乱。在此期间,请投票并标记为完成。谢谢。