XPath не работает должным образом, когда корневой тег получил свойство xmlns - PullRequest
5 голосов
/ 20 февраля 2012

Я пытаюсь проанализировать XML-файл, используя XPath

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true); // never forget this!
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse(File);

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();
    XPathExpression expr 
     = xpath.compile("//PerosnList/List/Person");

Мне потребовалось много времени, чтобы увидеть, что он не работает, потому что корневой элемент получил атрибут xmlns, как только я удаляю attr, он работает нормально!, как я могу обойти этот xlmns attr, не удаляя его из файла?

XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/vsDal.Entities">
.....
....
<PersonList>
...
<List>
<Person></Person>
<Person></Person>
<Person></Person>
</List>
</PersonList>
</Root>

Спасибо.

Ответы [ 2 ]

9 голосов
/ 20 февраля 2012

Атрибут xmlns - это больше, чем обычный атрибут.Это атрибут пространства имен , который используется для уникальной квалификации элементов и атрибутов.

Элементы PersonList, List и Person "наследуют" это пространство имен.Ваш XPath не совпадает, потому что вы выбираете элементы в «пространстве имен».Чтобы обратиться к элементам, связанным с пространством имен в XPath 1.0, вы должны определить префикс пространства имен и использовать его в своем выражении XPath.

Вы можете сделать свой XPath более универсальным и просто сопоставлять его с * 1012.*, чтобы он соответствовал элементам независимо от их пространства имен:

//*[local-name()='PersonList']/*[local-name()='List']/*[local-name()='Person']
7 голосов
/ 20 февраля 2012

Вам необходимо предоставить NamespaceContext и пространство имен своего выражения. См. здесь для примера.

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