#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 является сложным объектом. То есть это массив строк, результат которого отображается в первом элементе массива. Я сделаю это, чтобы предотвратить любую путаницу в будущем, если ссылка на суть когда-либо будет нарушена. Тем временем, пожалуйста, проголосуйте и отметьте как завершенный. Спасибо.