如何使用 XPathNodeIterator 检索值
How to retrieve values using XPathNodeIterator
我正在尝试使用 XPathNodeIterator select 来自元素的值。但是我无法从我的 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>
我获取值的方法
我创建了两种方法,它们都没有 return 我想要的值。
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;
}
我的 XPath
- 获取Address_Id
- XPath:
//Data/Address_Id/text()
- 尝试 1 returns:
767My Customer 1
。为什么所有的值都连接起来了???
- 尝试 2 returns:
7
。看起来不错
- 获取Customer_Id
- XPath:
//Data/Customer_Id/text()
- 尝试 1 returns:
767My Customer 1
。为什么所有的值都连接起来了???
- 尝试 2 returns:
7
。为什么我得到 Address_Id??
问题
可能我使用的 XPath 不正确。但我也不明白结果。为了了解发生了什么。我想知道:
- 有没有更好的方式(方法)获取元素的值?
- 我需要使用的 XPath 字符串是什么?
- 为什么方法
GetValue_Attempt1
return 是一个连接字符串?
- 为什么方法
GetValue_Attempt2
return只有第一个元素的值?
您的 XPath returns 没有匹配项,因为您没有考虑命名空间。
您的 'Attempt 1' 调用了 MoveNext()
一次,因此 Value
returns Data
中的所有串联文本以及您调用的 'Attempt 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 to XML 会更可取,我认为:
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();
我正在尝试使用 XPathNodeIterator select 来自元素的值。但是我无法从我的 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>
我获取值的方法
我创建了两种方法,它们都没有 return 我想要的值。
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;
}
我的 XPath
- 获取Address_Id
- XPath:
//Data/Address_Id/text()
- 尝试 1 returns:
767My Customer 1
。为什么所有的值都连接起来了??? - 尝试 2 returns:
7
。看起来不错
- XPath:
- 获取Customer_Id
- XPath:
//Data/Customer_Id/text()
- 尝试 1 returns:
767My Customer 1
。为什么所有的值都连接起来了??? - 尝试 2 returns:
7
。为什么我得到 Address_Id??
- XPath:
问题
可能我使用的 XPath 不正确。但我也不明白结果。为了了解发生了什么。我想知道:
- 有没有更好的方式(方法)获取元素的值?
- 我需要使用的 XPath 字符串是什么?
- 为什么方法
GetValue_Attempt1
return 是一个连接字符串? - 为什么方法
GetValue_Attempt2
return只有第一个元素的值?
您的 XPath returns 没有匹配项,因为您没有考虑命名空间。
您的 'Attempt 1' 调用了 MoveNext()
一次,因此 Value
returns Data
中的所有串联文本以及您调用的 'Attempt 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 to XML 会更可取,我认为:
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();