我试图使用XPathNodeIterator从元素中选择值。但是,我无法从我的XML文件中获得预期的值。
我的XML文件
<?xml version="1.0" encoding="utf-8"?>
<ns0:Entity xmlns:ns0="http://schemas.mycompany.com/1.0">
<ns0:Data>
<Address_Id xmlns:ns0="http://schemas.mycompany.com/1.0">7</Address_Id>
<Customer_Id xmlns:ns0="http://schemas.mycompany.com/1.0">67</Customer_Id>
<CustomerName xmlns:ns0="http://schemas.mycompany.com/1.0">My Customer 1</CustomerName>
</ns0:Data>
</ns0:Entity>获取值的方法
我创建了两个方法,它们都不返回我想要的值。
private static string GetValue_Attempt1(XPathDocument xPathDocument, string xpathExpression)
{
var xpathNavigator = xPathDocument.CreateNavigator();
var xpathNodeIterator = xpathNavigator.Select(xpathExpression);
xpathNodeIterator.MoveNext();
return xpathNodeIterator.Current.Value;
}
private static string GetValue_Attempt2(XPathDocument xPathDocument, string xpathExpression)
{
var xpathNavigator = xPathDocument.CreateNavigator();
var xpathNodeIterator = xpathNavigator.Select(xpathExpression);
xpathNodeIterator.MoveNext();
var nodesNavigator = xpathNodeIterator.Current;
var nodesText = nodesNavigator.SelectDescendants(XPathNodeType.Text, false);
nodesText.MoveNext();
return nodesText.Current.Value;
}My XPath
//Data/Address_Id/text()767My Customer 1。为什么所有的值都是连在一起的??7。看上去没问题
//Data/Customer_Id/text()767My Customer 1。为什么所有的值都是连在一起的??7。我为什么要拿到Address_Id??
问题
可能我使用的是不正确的XPath。但我也不明白结果。为了了解发生了什么。我想知道:
GetValue_Attempt1 要返回一个串连字符串?GetValue_Attempt2 只返回第一个元素的值?发布于 2015-09-01 16:15:21
您的XPath不返回匹配,因为您没有考虑到名称空间。
您的“尝试1”只调用一次MoveNext(),因此Value返回Data中所有连接的文本,而在“尝试2”中,您调用MoveNext()两次,这将使您位于Address_Id元素中。
此外,Select,即使是XPath是有效的,实际上也不会移动光标。
如果您想得到这个值,您可以这样做--注意,我在XPath中包含了名称空间,并使用了SelectSingleNode的结果
var nsm = new XmlNamespaceManager(new NameTable());
nsm.AddNamespace("ns0", "http://schemas.mycompany.com/1.0");
var value = navigator.SelectSingleNode("//ns0:Data/Address_Id", nsm).Value;但是,您有理由在这里使用XPath和XPathDocument吗?使用更有表现力和(更多)静态类型的LINQ会更好,我认为:
XNamespace ns = "http://schemas.mycompany.com/1.0";
var doc = XDocument.Parse(xml);
var addressId = (int)doc.Descendants(ns + "Data")
.Elements("Address_Id")
.Single();
var customerId = (int)doc.Descendants(ns + "Data")
.Elements("Customer_Id")
.Single();https://stackoverflow.com/questions/32328815
复制相似问题