Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net LINQ到XML:如何仅获取XElement的直接后代? Dim xml= 托马斯 提姆 杰米 Dim parents=xml.Elements_.net_Xml_Vb.net_Linq To Xml - Fatal编程技术网

.net LINQ到XML:如何仅获取XElement的直接后代? Dim xml= 托马斯 提姆 杰米 Dim parents=xml.Elements

.net LINQ到XML:如何仅获取XElement的直接后代? Dim xml= 托马斯 提姆 杰米 Dim parents=xml.Elements,.net,xml,vb.net,linq-to-xml,.net,Xml,Vb.net,Linq To Xml,在这种情况下,子元素包括所有父元素和所有子元素。只有的直系后代才能获得的最佳方式是什么 我是否应该编写一个LINQ查询来选择parent=所在的元素?或者是我缺少的某种内置方法可以帮我实现这一点 编辑:我对XElement.Elements和XElement.subjects有一些混淆。正如鲁本·巴特林指出的那样,XElement.Elements将为我提供我想要的东西。执行摘要-您想要: Dim xml = <Root> <Parent id="1"&

在这种情况下,
子元素
包括所有父元素和所有子元素。只有
的直系后代才能获得的最佳方式是什么

我是否应该编写一个LINQ查询来选择parent=
所在的元素?或者是我缺少的某种内置方法可以帮我实现这一点


编辑:我对
XElement.Elements
XElement.subjects
有一些混淆。正如鲁本·巴特林指出的那样,
XElement.Elements
将为我提供我想要的东西。

执行摘要-您想要:

Dim xml = <Root>
            <Parent id="1">
              <Child>Thomas</Child>
            </Parent>
            <Parent id="2">
              <Child>Tim</Child>
              <Child>Jamie</Child>
            </Parent>
          </Root>

Dim parents = xml.Elements
Dim parentNames = xml.Elements.Select(function(element) element.Name)
第一个答案:

XElement.subjects
,还是一个技巧性问题P

修改后的答案,谢谢你,托莫德——确实有点不对劲!:

元素提供了您正在寻找的直接后代。子体提供完整的层次结构[正如您所断言的元素那样]。(我链接到的例子说明了这一点。对于造成的混乱,我深表歉意

所以,最后,您要寻找的是(这次是在VB中):

如果您只需要实际名称,可以使用以下内容:

Dim parents = xml.Elements
请注意,在每种情况下,您都会得到两个结果

如果你真的想把孩子们赶走,你需要:

Dim xml = <Root>
            <Parent id="1">
              <Child>Thomas</Child>
            </Parent>
            <Parent id="2">
              <Child>Tim</Child>
              <Child>Jamie</Child>
            </Parent>
          </Root>

Dim parents = xml.Elements
Dim parentNames = xml.Elements.Select(function(element) element.Name)
您可以扩展您的问题以显示您真正想要的是什么吗?

为什么不使用XPath

Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))

我只是把它从C#转换成VB。

如果所有的直接子代都有相同的已知元素名,并且这个元素名不能出现在另一个级别,那么可以使用xml。子代(“父代”)。

获取子元素的集合。例如

Dim myXML As var = New XmlDocument()
myXML.Load(myXML.xml)

For Each node As XmlNode In myXML.SelectNodes("//")
    Dim myVar As var = node.SelectSingleNode("Parent").InnerText
Next
var s=@”
";
var doc=XElement.Load(新的StringReader);
Console.WriteLine(doc.Elements().Count());//3
Console.WriteLine(doc.subjects().Count());//6

使用Linq我们可以做到这一点

var s = @"<root>
             <e1>
                 <e2>
                 </e2>
             </e1>
             <e1>
                 <e2>
                 </e2>
             </e1>
             <e1>
                 <e2>
                 </e2>
             </e1>
          </root>";

var doc = XElement.Load( new StringReader(s) );

Console.WriteLine( doc.Elements().Count() ); // 3
Console.WriteLine( doc.Descendants().Count()); //6
string s=“ThomasTimJamie”;
XDocument xdoc=XDocument.Parse;
foreach(xdoc.subjects()中的XElement DirectChild,其中(child=>child.Parent==xdoc.Root))
{
//在这里做事
}

希望这有帮助。谢谢。

subjections()方法获取所有子代,而不仅仅是直接子代。在这种情况下,“root”的子代也将包括所有子元素。@Tormod,你确定吗?看到示例了吗?如果没有,子代和元素之间的区别是什么?XLinq做得非常简洁[一旦人们对使用哪种方法有了明确的认识:P]很公平:P我必须研究一下,如果大家都转向XLinq,我想XPath已经过时了!你能编辑你最终使用的实际咒语吗?顺便说一句,请下载LINQPAd并试用它-它非常适合测试这样的东西。参见
string s = "<Root><Parent id=\"1\"><Child>Thomas</Child></Parent><Parent id=\"2\"><Child>Tim</Child><Child>Jamie</Child></Parent></Root>";
XDocument xdoc = XDocument.Parse(s);
foreach (XElement DirectChild in xdoc.Descendants().Where(child => child.Parent == xdoc.Root))
{
//Do stuff here
}