XML 命名空间问题 C#
XML namespace issue C#
我有一个 XML,我正在尝试从 XmlDocument 获取节点,但由于一些命名空间问题,它没有返回我想要的节点。
以下是我的XML.
<?xml version="1.0" encoding="iso-8859-1"?>
<message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.origoservices.com">
<content>
<application>
<personal_client id="pc1">
<title>Mr</title>
<forenames>Test</forenames>
<surname>SurName</surname>
<sex>Male</sex>
</personal_client>
<personal_client id="pc2">
<title>Mr</title>
<forenames>Test</forenames>
<surname>SurName</surname>
<sex>Male</sex>
</personal_client>
<personal_client id="pc3">
<title>Mr</title>
<forenames>Test</forenames>
<surname>SurName</surname>
<sex>Male</sex>
</personal_client>
</application>
</content>
</message>
以下是我用来从上面 xml.
获取所有 personal_client 节点的 C# 代码
XmlDocument XMLDoc = new XmlDocument();
XMLDoc.PreserveWhitespace = true;
XMLDoc.Load("XML Loaded successfully");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLDoc.NameTable);
nsmgr.AddNamespace("origo", "http://www.origoservices.com");
nsmgr.PushScope();
XmlNodeList xnList = XMLDoc.SelectNodes("//origo:message/m_content/application/personal_client", nsmgr);
一直返回0个节点,请帮忙。
您需要为查询的每个元素指定命名空间,因为默认命名空间也应用于子节点。我已将您的示例 XML 放入名为 XmlFile1.xml 的文件中并创建了以下示例:
var XMLDoc = new XmlDocument();
XMLDoc.Load("XmlFile1.xml");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLDoc.NameTable);
nsmgr.AddNamespace("origo", "http://www.origoservices.com");
XmlNodeList xnList = XMLDoc.SelectNodes("//origo:message/origo:content/origo:application/origo:personal_client", nsmgr);
此代码检索 3 个节点。
这是另一种方式
//Using the file path
var clients = XDocument.Load(xmlFilePath)
.Descendants(XName.Get("personal_client", "http://www.origoservices.com"));
//Using the file content
var clients = XDocument.Parse(xmlFileContent)
.Descendants(XName.Get("personal_client", "http://www.origoservices.com"));
这样你就可以避免把命名空间
.Descendants().Where(x => x.Name.LocalName == "personal_client");
我有一个 XML,我正在尝试从 XmlDocument 获取节点,但由于一些命名空间问题,它没有返回我想要的节点。
以下是我的XML.
<?xml version="1.0" encoding="iso-8859-1"?>
<message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.origoservices.com">
<content>
<application>
<personal_client id="pc1">
<title>Mr</title>
<forenames>Test</forenames>
<surname>SurName</surname>
<sex>Male</sex>
</personal_client>
<personal_client id="pc2">
<title>Mr</title>
<forenames>Test</forenames>
<surname>SurName</surname>
<sex>Male</sex>
</personal_client>
<personal_client id="pc3">
<title>Mr</title>
<forenames>Test</forenames>
<surname>SurName</surname>
<sex>Male</sex>
</personal_client>
</application>
</content>
</message>
以下是我用来从上面 xml.
获取所有 personal_client 节点的 C# 代码XmlDocument XMLDoc = new XmlDocument();
XMLDoc.PreserveWhitespace = true;
XMLDoc.Load("XML Loaded successfully");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLDoc.NameTable);
nsmgr.AddNamespace("origo", "http://www.origoservices.com");
nsmgr.PushScope();
XmlNodeList xnList = XMLDoc.SelectNodes("//origo:message/m_content/application/personal_client", nsmgr);
一直返回0个节点,请帮忙。
您需要为查询的每个元素指定命名空间,因为默认命名空间也应用于子节点。我已将您的示例 XML 放入名为 XmlFile1.xml 的文件中并创建了以下示例:
var XMLDoc = new XmlDocument();
XMLDoc.Load("XmlFile1.xml");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLDoc.NameTable);
nsmgr.AddNamespace("origo", "http://www.origoservices.com");
XmlNodeList xnList = XMLDoc.SelectNodes("//origo:message/origo:content/origo:application/origo:personal_client", nsmgr);
此代码检索 3 个节点。
这是另一种方式
//Using the file path
var clients = XDocument.Load(xmlFilePath)
.Descendants(XName.Get("personal_client", "http://www.origoservices.com"));
//Using the file content
var clients = XDocument.Parse(xmlFileContent)
.Descendants(XName.Get("personal_client", "http://www.origoservices.com"));
这样你就可以避免把命名空间
.Descendants().Where(x => x.Name.LocalName == "personal_client");