Регулярное выражение строки xml - PullRequest
0 голосов
/ 26 августа 2009

Как правильно найти такую ​​строку в большом xml:

<ser:serviceItemValues>
    <ord1:label>Start Type</ord1:label>
    <ord1:value>Loop</ord1:value>
    <ord1:valueCd/>
    <ord1:activityCd>iactn</ord1:activityCd>
 </ser:serviceItemValues>

1-й в этом xml будет много повторов элемента выше с разными значениями (Loop и т. Д.) И других элементов xml в этом документе В основном меня беспокоит, если есть serviceItemValues, у которого нет 'Loop' в качестве значения. Я пробовал это, но это не похоже на работу:

private static Pattern LOOP_REGEX =
        Pattern.compile("[\\p{Print}]*?<ord1:label>Start Type</ord1:label>[\\p{Print}]+[^(Loop)][\\p{Print}]+</ser:serviceItemValues>[\\p{Print}]*?", Pattern.CASE_INSENSITIVE|Pattern.MULTILINE);

Спасибо

Ответы [ 5 ]

4 голосов
/ 26 августа 2009

Регулярные выражения - не лучший вариант при разборе больших объемов HTML или XML.

Существует несколько способов справиться с этим, не полагаясь на регулярные выражения. В зависимости от библиотек, которые есть в вашем распоряжении, вы можете найти нужные элементы с помощью XPath.

Вот полезный учебник, который может помочь вам на вашем пути: http://www.totheriver.com/learn/xml/xmltutorial.html

3 голосов
/ 27 августа 2009

Посмотрите XPath , что похоже на регулярное выражение для XML. Вроде.

С XPath вы пишете выражения, которые извлекают информацию из документов XML, поэтому извлечение узлов, у которых нет Loop в качестве подузла, является именно тем, для чего он вырезан.

Я не пробовал этого, но в качестве первого удара, я думаю, выражение XPath будет выглядеть примерно так:

"//ser:serviceItemValues/ord1:value[text()!='Loop']/parent::*"
3 голосов
/ 26 августа 2009

Регулярное выражение не подходит для этого задания . Вы должны использовать парсер XML. Он довольно прост в настройке и использовании и, вероятно, займет меньше времени для написания кода. Затем он придет с этим регулярным выражением.

Я рекомендую использовать JDOM . У него простой синтаксис. Пример можно найти здесь: http://notetodogself.blogspot.com/2008/04/teamsite-dcr-java-parser.html

Если документы, которые вы будете анализировать, большие, вам следует использовать синтаксический анализатор SAX, я рекомендую Xerces .

1 голос
/ 27 августа 2009

Как уже упоминалось в других ответах, регулярные выражения не являются инструментом для работы. Вам нужен движок XPath. Если вы хотите сделать это из командной строки, я рекомендую установить XMLStar . У меня очень хороший опыт работы с этим инструментом и решения различных задач, связанных с XML. В зависимости от вашей ОС вы можете просто установить пакет xmlstarlet RPM или deb . Порты Mac OS X также включают в себя пакет.

1 голос
/ 26 августа 2009

При работе с XML вам не следует использовать регулярные выражения для проверки содержимого. Вместо этого используйте либо процедуру синтаксического анализа SAX для проверки соответствующего содержимого, либо DOM-подобную модель (предпочтительно основанную на извлечении, если вы работаете с большими документами).

Конечно, если вы пытаетесь как-то проверить содержание документа, вам, вероятно, следует использовать какой-либо инструмент схемы (я бы выбрал RELAX NG или Schematron, но я думаю, вы могли бы использовать схему XML).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...