2009-08-26 2 views
0

Что бы правильный способ найти строку, как это в большом XML:Regex XML строка

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

первым в этом 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); 

Благодаря

+0

Спасибо за все комментарии, позвольте мне пояснить, кто говорит, что не использовать регулярное выражение. Меня не волнует, что такое значение, я не пытаюсь его получить. Я просто хочу быть уверенным, что он говорит о цикле, если это не произойдет, я сделаю исключение. Поэтому я предполагаю, что это проверка, но я не могу изменить xsd. – arinte

+1

Я считаю, что все понимают, что вы пытаетесь сделать. Однако регулярные выражения не являются лучшим решением. Разметку лучше всего оставить парсерам. – doomspork

ответ

3

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

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

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

"//ser:serviceItemValues/ord1:value[text()!='Loop']/parent::*" 
+0

Остановите это, вы все знаете, что это неправильный способ подойти к проблеме :( – Esko

+1

Почему это неправильно? Это именно то, для чего нужен xpath, не так ли? – izb

4

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

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

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

3

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

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

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

1

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

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

1

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

+0

Упс, вы хотели сделать это на Java. , xmlstar по-прежнему классный инструмент. – Hardy