如何使用已有名称空间的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一起工作,在我修复它之后(它目前不是有效的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");
不需要命名空间管理器等