无法使用SelectSingleNode方法选择具有XML命名空间的XML节点

时间:2014-05-09 12:16:54

标签: c# .net xml select

我有以下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.

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

LINQ to Xml可以让事情变得更轻松:

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