Использовать пространства имен с XPath в VB.NET с XML - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь выбрать конкретный <Relationships> узел с XML в VB.NET.Проблема, которая возникает, заключается в том, что при моем установленном XPath я получаю сообщение об ошибке:

Требуется менеджер пространства имен или XsltContext.Этот запрос имеет префикс, переменную или пользовательскую функцию.

Это XPath, который я использую:

Dim parentNode As XmlNode = myXmlDocument.SelectSingleNode("/pkg:package/pkg:part[@pkg:name='/_rels/.rels']/pkg:xmlData/Relationships[@xmlns='http://schemas.openxmlformats.org/package/2006/relationships']")

Я понимаю, что вы должны добавитьменеджер пространства имен, который я пытался сделать.Тем не менее, я перепутал все определения и примеры, которые я видел, и поэтому у меня не работает код:

Dim namespaceManager As XmlNamespaceManager = New XmlNamespaceManager(myXmlDocument.NameTable)
namespaceManager.AddNamespace("xmlns:pkg", "http://schemas.microsoft.com/office/2006/xmlPackage")
namespaceManager.AddNamespace("xmlns", "http://schemas.openxmlformats.org/package/2006/relationships")

Приведенный выше код привел к следующей ошибке во втором пространстве имен I 'm добавление:

Префикс "xmlns" зарезервирован для использования XML.

Мой XML-файл выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="PowerPoint.Show"?>
<pkg:package
    xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
    <pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512">
        <pkg:xmlData>
            <Relationships
                xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
                <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
                <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
                <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="ppt/presentation.xml"/>
            </Relationships>
        </pkg:xmlData>
    </pkg:part>
</pkg:package>

I 'Я не понимаю, как вы должны работать с этими пространствами имен в VB.NET и , чтобы включить их в ваш XPath.Есть кто-нибудь, кто сейчас, как решить эту проблему и выбрать <Relationships> узел?

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Гораздо лучше использовать API LINQ to XML при работе с XML.Он доступен более десяти лет.

VB.NET

Dim myXmlDocument As XDocument = XDocument.Load("e:\temp\package.xml")

Dim ns0 As XNamespace = "http://schemas.microsoft.com/office/2006/xmlPackage"
Dim ns1 As XNamespace = "http://schemas.openxmlformats.org/package/2006/relationships"


Dim Relationships As XElement = myXmlDocument.Descendants(ns1 + "Relationships").FirstOrDefault()

Console.WriteLine(Relationships)
0 голосов
/ 22 сентября 2019

Вам необходимо добавить префикс пространства имен, как показано ниже.

VB.NET

Dim namespaceManager As XmlNamespaceManager = New XmlNamespaceManager(myXmlDocument.NameTable)
namespaceManager.AddNamespace("xmlns:pkg", "http://schemas.microsoft.com/office/2006/xmlPackage")
namespaceManager.AddNamespace("xmlns:ns1", "http://schemas.openxmlformats.org/package/2006/relationships")

После этого следующее выражение XPath даст доступ к Отношения Фрагмент.

/pkg:package/pkg:part/pkg:xmlData/ns1:Relationships
...