Получить пространства имен XML с помощью Regex - PullRequest
2 голосов
/ 19 февраля 2010

Учитывая фрагмент XML, который я хочу проанализировать с XPath, мне сначала нужно извлечь пространства имен для добавления в диспетчер пространства имен. Я пытался выяснить шаблон Regex, необходимый для извлечения атрибутов XML, которые определяют пространство имен. Например, я хочу получить все пространства имен, с помощью которых я могу выполнить более простые манипуляции со строками, чтобы отделить имя пространства имен и URL.

xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45"

Имя атрибута всегда начинается с xmlns: и мне нужно, чтобы регулярное выражение читалось до конца значения, поэтому включите последний "

В качестве альтернативы, более общий шаблон мог бы выполнять работу по извлечению ВСЕХ атрибутов в форме name = "value", и я могу просто выполнить некоторые сравнения строк, чтобы увидеть, является ли каждый атрибут пространством имен.

<my:StationLookupValues xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45"><my:StationLookupValue>Hull Inspectors</my:StationLookupValue></my:StationLookupValues><my:StationLookupValues xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45"><my:StationLookupValue>Barnsley Inspectors</my:StationLookupValue></my:StationLookupValues><my:StationValue xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45">Hull Inspectors</my:StationValue>

Я не смог ни найти пример чего-то подобного, ни выработать его для себя. Любая помощь по этому вопросу будет очень ценна.

[EDIT] Я понимаю, что должны использоваться парсеры XML, и это то, что я собираюсь сделать. Но все, что у меня есть, это XML-фрагмент для передачи, поэтому я должен сначала построить менеджер пространства имен, а для этого мне нужно извлечь используемые пространства имен.

Ответы [ 4 ]

4 голосов
/ 19 февраля 2010

Попробуйте этот шаблон: 'xmlns: (. *?) = (". *?")'

Это значит

  • буквенная строка xmlns:
  • самая короткая строка до =
  • кавычка, за которой следует самая короткая строка до следующей кавычки

Круглые скобки означают, что первая группа содержит имя пространства имен, вторая группа - это значение. Отрегулируйте в соответствии с тем, хотите ли вы все в одном, и хотите ли вы или не хотите кавычки в группе.

Как Томалак указал в своем ответе, это чревато опасностью. Он может потенциально соответствовать шаблонам, которые являются частями комментариев или встраиваются в строки как данные и т. Д. Вот почему регулярные выражения не подходят для анализа XML-данных - поскольку на самом деле вы не анализируете , просто ищу шаблоны без учета контекста).

2 голосов
/ 19 февраля 2010

Имейте в виду, что такие вещи возможны:

<elem>
  <x:elem xmlns:x="http://some/namespace" />
  <x:elem xmlns:x="http://some/other/namespace" />
  <elem xmlns="http://some/third/namespace" />
  <elem>
     XML Namespaces look like xmlns:foo="http://some/foo/namespace"!
  </elem>
  <!-- remember to put xmlns:x="http://some/namespace" back in! -->
  <elem />
</elem>

Простое извлечение пространств имен и префиксов с помощью регулярного выражения в какой-то момент может привести к ошибкам.

1 голос
/ 17 марта 2010

Регулярное выражение, упомянутое Брайаном Окли, будет работать (с оговорками, которые он упоминает).

Другие, кто высказался против идеи не знать пространства имен, включенного в XML-документ для анализа, забывают о спецификации XSDдля подстановочных знаков (см. раздел 3.10 спецификации XML-схемы части 1 ).

Вы можете быть в сценарии, как я в настоящее время, где у вас есть только определенная базовая XSD, но которая намеренноопределилэлементы для разрешения произвольных расширений XML из других пространств имен.В этом сценарии вам придется использовать XPath для анализа любого XML из других пространств имен, которые используют элементы подстановки XSD.Для моего парсера мне нужно сначала выяснить, какие пространства имен используются.Затем, основываясь на этом, возьмите соответствующие предопределенные XPath для этих пространств имен, прежде чем я смогу проанализировать документ.

Использование подстановочных знаков XSD удобно, когда вам нужна просто базовая структура, но также требуется гибкость, позволяющая другимдобавлять свою собственную информацию независимо друг от друга, чтобы вам не приходилось постоянно пересматривать XSD для любого случайного запроса из другой группы и рисковать нарушением тех, кто в данный момент использует схему.

Я не нашел окончательного решения дляэто сам.Но склоняется к использованию регулярных выражений для захвата префиксов XML (которые, вероятно, будут иметь ложные срабатывания), а затем проверяет эти совпадения с помощью JAXP org.w3c.dom.Document.lookupNamespaceURI (префикс String) для удаления ложных срабатываний.

1 голос
/ 25 февраля 2010

Я думаю, что обработка XML, содержащего пространства имен, без знания того, что это за пространства имен, является признаком того, что кто-то где-то что-то делает неправильно.

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

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