【问题标题】:Cannot select an XML node with XML namespace using SelectSingleNode method无法使用 SelectSingleNode 方法选择具有 XML 命名空间的 XML 节点
【发布时间】:2014-06-27 04:26:24
【问题描述】:

我有以下 XML

<?xml version="1.0" encoding="UTF-8"?>
<form:Documents xmlns:form="http://www.example.com/file.xsd" xmlns:addData="http://www.example.com/file2.xsd">
    <_colored:_colored addData:DocumentState="Correct" xmlns:_colored="http://www.example.com/colored.xsd">
        <_colored>
            <_Field1>PB8996MT</_Field1>
        </_colored>
    </_colored:_colored>
</form:Documents>

我尝试通过编写以下 C# 代码来获取 _Field1 标记的内部文本:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(filePath);

string fieldValue = xmlDocument.SelectSingleNode("/form:Documents/_colored:_colored/_colored/_Field1").InnerText;

当我运行应用程序时,出现以下异常:

Unhandled Exception: System.Xml.XPath.XPathException: Namespace Manager or XsltContext needed. 
This query has a prefix, variable, or user-defined function.

【问题讨论】:

标签: c# .net xml select


【解决方案1】:

您应该使用 XmlNamespaceManager 声明命名空间前缀,然后才能在 XPath 表达式中使用它。

XmlDocument doc = new XmlDocument ();
doc.Load("/Users/buttercup/Projects/23564466/kram.xml");

XmlNamespaceManager nmspc = new XmlNamespaceManager(doc.NameTable);
nmspc.AddNamespace("form", "http://www.example.com/file.xsd");
nmspc.AddNamespace("addData", "http://www.example.com/file2.xsd");
nmspc.AddNamespace("_colored", "http://www.example.com/colored.xsd");

string fieldValue = doc.SelectSingleNode("/form:Documents/_colored:_colored/_colored/_Field1", nmspc).InnerText;

http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.aspx

【讨论】:

  • 谢谢,现在可以了。但我不需要添加 nmspc.AddNamespace("addData", "example.com/file2.xsd"); 行,而是 nsmgr.AddNamespace("_colored", "example.com/colored.xsd");请在您的答案中修正它,以免我们误导其他人:)
  • 感谢您发现错误。我第一次写答案时没有测试代码,现在它已经过测试并且可以工作了。
【解决方案2】:

LINQ to Xml 可以让事情变得更简单:

 XDocument doc = XDocument.Load(filePath);
 var value = doc.Descendants("_Field1").First().Value;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多