【问题标题】:Use namespaces with XPath in VB.NET with XML在带有 XML 的 VB.NET 中使用带有 XPath 的命名空间
【发布时间】:2020-01-22 20:45:36
【问题描述】:

我正在尝试在 VB.NET 中使用 XML 选择特定的 <Relationships> 节点。发生的问题是,使用我设置的 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")

上面的代码导致我添加的第二个命名空间出现以下错误:

前缀“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>

我不明白你应该如何在 VB.NET 中使用这些命名空间将它们合并到你的 XPath 中。有没有人现在如何解决这个问题并选择&lt;Relationships&gt; 节点?

【问题讨论】:

    标签: xml vb.net xml-namespaces


    【解决方案1】:

    在处理 XML 时最好使用 LINQ to XML API。它已经存在了十多年。

    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)
    

    【讨论】:

    • 我没有考虑过使用 LINQ to XML,我以前没有使用过。现在我已经研究过了,它工作得更好,并且留下了更清晰的代码。非常感谢您的回答,我会将其标记为正确答案^
    【解决方案2】:

    您需要添加一个命名空间前缀,如下所示。

    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 表达式将允许访问 Relationships 片段。

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

    【讨论】:

    • 感谢您的回答。我已经尝试过了,但现在我收到System.Xml.XPath.XPathException: 'The prefix of namespace ns1 is not defined.' 作为错误。我该如何解决?
    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多