.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
}