Coldfusion — необходимо получить строковые данные между открывающим и закрывающим тегами

#sql #parsing #coldfusion

#sql #синтаксический анализ #coldfusion

Вопрос:

Я пытаюсь получить конкретные данные между двумя строками, которые являются открывающим и закрывающим тегом. Обычно я бы просто проанализировал его с помощью 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?

Любые предложения будут оценены.

Спасибо!

Ответ №1:

Да, вы можете использовать сопоставление регулярных выражений для извлечения подстроки, содержащей текст между <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

Комментарии:

1. Большое спасибо. Кажется, работает. Но когда я пытаюсь вывести #parsedXml# и получаю следующее: сложные типы объектов не могут быть преобразованы в простые значения. Выражение запросило переменную или промежуточный результат выражения в виде простого значения. Однако результат не может быть преобразован в простое значение. Простыми значениями являются строки, числа, логические значения и значения даты / времени. Запросы, массивы и COM-объекты являются примерами сложных значений. <p> Наиболее вероятной причиной ошибки является то, что вы пытались использовать сложное значение как простое. Есть идеи, что могло бы вызвать это? Большое спасибо!

2. Удалите это… Я должен был посмотреть на ваш пример, который вы предоставили. Я пытался установить его, а затем вывести.

3. использовал ваше предложение, и оно отлично сработало. Ты КОРОЛЬ! Большое вам спасибо … по-настоящему ценится!

4. @Scott Да, я отредактирую свой ответ, чтобы отразить, что parsedXml является сложным объектом. То есть это массив строк, результат которого отображается в первом элементе массива. Я сделаю это, чтобы предотвратить любую путаницу в будущем, если ссылка на суть когда-либо будет нарушена. Тем временем, пожалуйста, проголосуйте и отметьте как завершенный. Спасибо.