我在Resources.xmltest中有以下Xml:
<?xml version="1.0" encoding="utf-8" ?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://DFISofft.com/SmartPayments/">
<Result>0</Result>
<Message>Pending</Message>
<PNRef>222131</PNRef>
<ExtData>InvNum=123</ExtData>
</Response>
我已经尝试了几种方法来获取值,结果,消息,PNRef,ExtData,并且我没有运气。我总是得到NodePath的空值,所以它永远不会进入循环:
var XmlDoc = new XmlDocument();
XmlDoc.LoadXml(Resources.xmltest);
XmlElement NodePath = (XmlElement) XmlDoc.SelectSingleNode("/Response");
while (NodePath != null)
{
foreach (XmlNode Xml_Node in NodePath)
{
Console.WriteLine(Xml_Node.Name + " " + Xml_Node.InnerText);
}
}
我试过这个:
XmlNode node3 = XmlDoc.SelectSingleNode("PNRef");
Console.WriteLine(node3.Value);
Console.WriteLine(XmlDoc.InnerXml);
var tst = XmlDoc.GetElementsByTagName("PNRef");
Console.WriteLine(tst);
而且:
NodePath = (XmlElement) XmlDoc.SelectSingleNode("/Response");
if (NodePath != null)
{
foreach (XmlNode node in NodePath)
{
Console.WriteLine("NodeName: " + Xml_NodeX.Name);
Console.WriteLine("NodeValue: " + node.InnerText);
}
}
显然,我没有得到xml读/写。我已经使用DataSet进行了操作,但他们为您完成了所有工作。
有人能指出我正确的方向吗?我已经在这里工作的时间比我本来应该的时间长了。
谢谢!
答案 0 :(得分:4)
您的XML有 XML命名空间,而您没有注意它:
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://DFISofft.com/SmartPayments/">
******************************************
从此XML中选择时,您需要使用该XML命名空间!
您没有考虑文档上的XML命名空间(xmlns="http://nts-de-osm1-pxc/webservices/"
)!
试试这个:
var XmlDoc = new XmlDocument();
// setup the XML namespace manager
XmlNamespaceManager mgr = new XmlNamespaceManager(XmlDoc.NameTable);
// add the relevant namespaces to the XML namespace manager
mgr.AddNamespace("ns", "http://DFISofft.com/SmartPayments/");
XmlDoc.LoadXml(Resources.xmltest);
// **USE** the XML anemspace in your XPath !!
XmlElement NodePath = (XmlElement) XmlDoc.SelectSingleNode("/ns:Response");
while (NodePath != null)
{
foreach (XmlNode Xml_Node in NodePath)
{
Console.WriteLine(Xml_Node.Name + " " + Xml_Node.InnerText);
}
}
答案 1 :(得分:3)
问题是您的XPath查询,它没有指定命名空间 - 尽管您的文档在“http://DFISofft.com/SmartPayments/”命名空间中只有Response
元素。同上PNRef
元素。
如果我实际想要尽可能使用名称空间,我个人会使用LINQ to XML。例如:
XNamespace ns = "http://DFISofft.com/SmartPayments/";
XDocument doc = XDocument.Load(filename);
foreach (var element in doc.Descendants(ns + "PNRef"))
{
// Use element here
}
正如您所看到的,LINQ to XML使得使用命名空间变得非常简单 - 当然它需要.NET 3.5或更高版本。如果我必须使用.NET 2.0,我要么使用XmlNamespaceManager
要么手动迭代并检查本地名称而不是使用XPath。
答案 2 :(得分:2)
那是因为节点没有被称为响应;您需要考虑名称空间:
var XmlDoc = new XmlDocument();
var nsmgr = new XmlNamespaceManager(XmlDoc.NameTable);
nsmgr.AddNamespace("x", "http://DFISofft.com/SmartPayments/");
XmlDoc.LoadXml(yourXml);
XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/x:Response", nsmgr);
答案 3 :(得分:0)
供将来参考......
Bubba Soft 该站点有一个很好的免费工具,用于构建XPath表达式(XPath Builder)。
答案 4 :(得分:0)
这是因为您使用假定空名称空间的SelectSingleNode
重载。由于您具有默认命名空间,因此您需要使用带有XmlNamespaceManager的版本。 See this article for more info.
来自文档:
如果XPath表达式不包含前缀,则假定名称空间URI是空名称空间。如果您的XML包含默认命名空间,您仍必须向XmlNamespaceManager添加前缀和命名空间URI;否则,您将无法选择节点。有关更多信息,请参阅使用XPath导航选择节点。