如何使用已有名称空间的xpath查询xml元素

本文关键字:xpath 查询 xml 元素 空间 何使用 有名称 | 更新日期: 2023-09-27 18:10:12

<?xml version="1.0" encoding="utf-8"?> 
<Report p1:schemaLocation="TemplateXXX http://localhost?language=en" Name="TemplateXXX" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="TemplateXXX"> 
   <HEADER attr1="one" attr2="two" /> 
   <Table filename="12345.pdf"> 
      <left> 
         <details> 
            <item/> 
            <item/> 
         </details> 
      </left> 
      <right> 
         <details> 
            <item/> 
            <item/> 
         </details> 
      </right> 
   </Table> 
</Report> 

我遇到了一个奇怪的问题,当试图查询元素和属性的xml文档,其中一个名称空间是在xml。

当我尝试使用以下xpath查询查询文档以获取header元素时,我始终得到空结果

XDocument root = XDocument.Load(filePath);
var element = root.XPathSelectElement("/Report/HEADER");

这总是返回null,但是当我从文档中删除名称空间时,查询返回期望的元素。

当我得到一些令人沮丧的东西时,我错了什么?

编辑:更新XML为有效XML

如何使用已有名称空间的xpath查询xml元素

我个人建议您在使用XPath时不要这样做,但是如果您确实需要,也可以这样做。这里是一个简短但完整的程序,它可以与您的示例XML一起工作,在我修复它之后(它目前不是有效的XML…请试着下次提供工作示例):

using System;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
class Test
{
    static void Main()
    {
        var doc = XDocument.Load("test.xml");
        var manager = new XmlNamespaceManager(new NameTable());
        manager.AddNamespace("foo", "TemplateXXX");
        var query = doc.XPathSelectElement("/foo:Report/foo:HEADER", manager);
        Console.WriteLine(query);
    }
}

在普通的LINQ到XML查询中,您只需使用:

XNamespace ns = "TemplateXXX";
XElement header = doc.RootElement.Element(ns + "HEADER");

不需要命名空间管理器等