Каков правильный XPath для xml с другим объявлением xml? - PullRequest
1 голос
/ 08 апреля 2011

Я пытаюсь настроить запрос XPath для следующего xml:

<Assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns="Assembly">
  <Parts>
    <Part>
      <PartName>Example</PartName>
    </Part>
  </Parts>
<Assembly>

Мне нужен элемент PartName, и я не смог правильно сослаться на него, поскольку объявление xml является узлом, а не обычным

<?xml version="1.0"?>

Может ли кто-нибудь помочь мне структурировать мой XPath?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2011

Объявление / регистрация пространства имен и использование префикса пространства имен в вашем XPath определенно предпочтительнее.

Однако, если вы хотите, чтобы XPath работал без регистрации пространств имен, вы можете использовать любой из следующих операторов XPath.:

/*[local-name()='Assembly' and namespace-uri()='Assembly']
  /*[local-name()='Parts' and namespace-uri()='Assembly']
    /*[local-name()='Part' and namespace-uri()='Assembly']
      /*[local-name()='PartName' and namespace-uri()='Assembly']

Этот файл короче, но менее "безопасен", поскольку сопоставляется только с именами элементов и не использует пространство имен в качестве критерия.

/*[local-name()='Assembly']
  /*[local-name()='Parts']
    /*[local-name()='Part']
      /*[local-name()='PartName']

Они длинные инекрасиво, но сработает.

1 голос
/ 08 апреля 2011

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

XmlNamespaceManager nsMgr = new XmlNamespaceManager(Document.NameTable);
nsMgr.AddNamespace("sc", "Assembly");

и XPath был //sc:Parts/sc:Part/sc:PartName

1 голос
/ 08 апреля 2011

// Сборка / Детали / Part / PartName

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