给出以下XML文档:
<?xml version="1.0"?>
<UrdaObject>
<Date>
<Year>2011</Year>
<Month>5</Month>
<Day>18</Day>
<Hours>8</Hours>
<Minutes>47</Minutes>
<Seconds>36</Seconds>
</Date>
<random_value>24</random_value>
</UrdaObject>
了解child::node() - Selects all child nodes of the current node
我将如何创建一个XPath
(从根开始),它将选择所有子节点,除了文本,注释和其他非元素的东西< / strong>即可。例如,使用此代码在WPF中创建树视图时:
// x is some XmlDocument, xmlTree is my WPF TreeView
XmlDataProvider provider = new XmlDataProvider();
provider.Document = x;
Binding binding = new Binding();
binding.Source = provider;
binding.XPath = "child::node()";
xmlTree.SetBinding(TreeView.ItemsSourceProperty, binding);
我将如何创建我的XPath语句,以便构建一个树视图,其中节点一直向下并在原始文本之前停止?例如,它会生成以下视图:
UrdaObject
Date
Year
...
而不是......
UrdaObject
Date
Year
2011 (Don't want this!)
...
示例XML文件仅供我解释我的情况。该表达式应该能够导航任何有效的XML文件并提取元素,而不是单个文本。
我们是如何解决此问题的?我已将child::node()
的所有引用都更改为child::*
。但是,我没有更正我的XAML中的一行,即提取child::node()
。纠正这一行使应用程序正常运行......让我感到愚蠢。
答案 0 :(得分:2)
就像*
一样简单。
(这会立即得到孩子;如果你想要所有的后代元素,那就是descendant::*
)
答案 1 :(得分:2)
child::node()
找到所有子节点。 child::*
找到所有元素节点。
答案 2 :(得分:1)
child::*
将排除文本节点并仅保留元素节点
child::text()
将仅包含文本节点
child::node()
将包含元素和文本节点
答案 3 :(得分:0)
不确定这是否是您想要的,但可以这样做吗?
var doc =XDocument.Parse(@"
<UrdaObject>
<Date>
<Year>2011</Year>
<Month>5</Month>
<Day>18</Day>
<Hours>8</Hours>
<Minutes>47</Minutes>
<Seconds>36</Seconds>
</Date>
<random_value>24</random_value>
</UrdaObject>
");
var query = from s in doc.Descendants()
select s.Name;
foreach (var name in query)
{
Console.WriteLine(name);
}