开发者

Select child nodes, but ignore non-elements with XPath?

Given the following XML document for example:

<?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>

And the understanding the child::node() - Selects all child nodes of the current node how would I create an XPath (starting from the root) that would select all child nodes EXCEPT text, comments, and other things that are NOT elements. For example, when using this code to create a tree view in 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.ItemsSo开发者_如何学PythonurceProperty, binding);

How would I go about creating my XPath statement so I build a treeview with nodes going all the way down and stopping before the raw text? For example it would generate a view of:

UrdaObject
  Date
    Year
...

Instead of...

UrdaObject
  Date
    Year
      2011 (Don't want this!)
...

The sample XML files is just for me to explain my situation. The expression should be able to navigate any valid XML file and pull the elements, but not the individual text.


How did we fix this? I had switched all references of child::node() to child::*. However, I had NOT corrected one line in my XAML, which was pulling child::node(). Correcting this line made the application behave correctly... and made me feel silly.


child::node() finds all child nodes. child::* finds all element nodes.


it's as simple as *.

(that gets immediate children, however; if you want all descendant elements, it would be descendant::*)


child::* will exclude text nodes and leave only element nodes

child::text() will include only text nodes

child::node() will include both element and text nodes

http://www.w3.org/TR/xpath/#location-paths


Not sure if this is what you want but could it be done this way?

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);
        }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜