2013-12-04 3 views
1

Я пытаюсь проанализировать документ с помощью Dom4J. Этот документ исходит от разных поставщиков, а иногда и с пространствами имен, а иногда и без него.Как разобрать XMLDocument в нейтральном пространстве имен с использованием JDOM

Для например:

<book> 
    <author>john</author> 
    <publisher> 
    <name>John Q</name> 
    </publisher> 
</book> 

или

<book xmlns="http://schemas.xml.com/XMLSchemaInstance"> 
    <author>john</author> 
    <publisher> 
    <name>John Q</name> 
    </publisher> 
</book> 

или

<book xmlns:i="http://schemas.xml.com/XMLSchemaInstance"> 
    <i:author>john</i:author> 
    <i:publisher> 
    <i:name>John Q</i:name> 
    </i:publisher> 
</book> 

У меня есть список XPaths. Я разбираю документ в классе Document, а затем выполняю поиск по нему с помощью xpaths.

 Document doc = parseDocument(documentFile); 
     List<String> XmlPaths = new List<String>(); 
     XmlPaths.add("book/author"); 
     XmlPaths.add("book/publisher/name"); 

     for (int i = 0; i < XmlPaths.size(); i++) 
     { 
      String searchPath = XmlPaths.get(i); 

      Node currentNode = doc.selectSingleNode(searchPath); 
      assert(currentNode != null); 
     } 

Этот код не работает над последним документом, который использует префиксы пространства имен.

Я пробовал эти методы, но ни один из них, похоже, не работает.

1) изменением последнего элемента в XPath, чтобы быть нейтральным пространством имен:

/book/:author 
/book/[local-name()='author'] 
/[local-name()='book']/[local-name()='author'] 

Все эти сгенерирует исключение, говоря, что формат XPATH не является правильным.

2) Добавление пространства имен uris в XPAth, после его создания с помощью DocumentHelper.createXPath();

Любая идея, что я делаю неправильно?

FYI Я использую DOM4J версии 1.5

ответ

2

Ваш XPath не содержит имя тега. Общий синтаксис в вашем случае будет

/TAGNAMEPARENT[CONDITION_PARENT]/TAGNAMECHILD[CONDITION_CHILD] 

Важным аспектом является то, что имена тегов являются обязательной в то время как условия опциональный. Если вы не хотите указывать имя тега, вы используете * для «любого тега». Для больших файлов XML могут возникать последствия для производительности, поскольку вам всегда придется перебирать набор узлов вместо использования индекса. Возможно, @MichaelKay может прокомментировать это.

Попробуйте вместо этого:

/*[local-name()='book']/*[local-name()='author'] 
+0

Спасибо. Так оно и было. Хотя я не понимаю, почему мне нужно поставить *. Не является ли local-name() псевдоним для тега? – feroze

+0

Я обновил свой naswer, чтобы добавить немного больше информации. –

 Смежные вопросы

  • Нет связанных вопросов^_^