【问题标题】:How to get just the root element from Xelement如何从 Xelement 获取根元素
【发布时间】:2012-06-15 12:42:40
【问题描述】:

我有以下 XElement:

 <Assembly name="3">
  <Component name="2" /> 
 </Assembly>

我只想获取根元素。 &lt;Assembly name="3"&gt;我找不到适合我的方法。

  XElement.????? I cant find XElement.Root;

有什么线索吗?

【问题讨论】:

  • 你想对元素做什么

标签: c# xml linq xelement


【解决方案1】:

你可以在 VB.NET 中试试这个

Dim elm as XElment = XElement.Parse(<Assembly name="3">
                                     <Component name="2" /> 
                                    </Assembly>)

Dim strName as string 
strName = elm.AncestorsAndSelf.First.Name

C#代码

XElement elm = XElement.Parse("<Assembly name='3'><Component name='2' /></Assembly>");
string name =elm.AncestorsAndSelf().First().Name;

【讨论】:

  • 这比其他答案更好,因为它不假定 XElement 植根于文档节点。这将始终获得最顶层的祖先元素。
【解决方案2】:

您可以通过这种方式获取根元素:

XDocument.Root

这是一个实现示例:

XDocument doc = new XDocument(
new XComment("This is a comment."),
new XElement("Pubs", 
    new XElement("Book",
        new XElement("Title", "Artifacts of Roman Civilization"),
        new XElement("Author", "Moreno, Jordao")
    ),
    new XElement("Book",
        new XElement("Title", "Midieval Tools and Implements"),
        new XElement("Author", "Gazit, Inbar")
    )
),
new XComment("This is another comment.")
);
Console.WriteLine(doc.Root.Name.ToString());

链接:http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.root.aspx

【讨论】:

  • Skeet 的回答更容易实现。谢谢
  • 这个答案可能看起来比公认的答案更复杂(这会改变树!),但这仅仅是因为它也展示了如何创建树。重要的部分是doc.Root
【解决方案3】:

您可以致电RemoveNodes...如果您出于其他原因需要保留原始内容,请先创建一个副本。

目前还不清楚你想用这个做什么。该元素在逻辑上包含其所有子元素 - 没有 XElement.Root 的概念,因为元素“就是它自己”。 RemoveNodes 将删除所有子节点,但如果您只想获取元素的名称或其属性,则完全可以在不更改结构的情况下执行此操作。

【讨论】:

  • 我在 Linq-Query 中发现了这个 Xelement。然后我需要将另一个 Xelement 插入到这个...编辑中。哇,我可以插入另一个 XElement 而不提取根。我找到了答案。谢谢!!!!
  • @kmxillo:所以只需致电element.Add(extraElement)。为什么你需要先剥离它?为您的问题添加上下文会很有帮助。
  • 老问题,但我必须添加这个,因为答案具有误导性。在任何典型的树中,总有一个根,特别是对于 XML,它的定义非常好。它是Parent 的传递闭包的最后一个,或者是逆文档顺序中的最后一个祖先。由于大多数树都以文档节点为根,因此您可以从任何节点简单地使用someNode.Document.Root(最后一位Root 为您提供根元素)。如果您有无父节点,则需要从someNode.Ancestors() 获取第一个。
【解决方案4】:

将名称和属性复制到新元素;

var root = new XElement(el.Name, el.Attributes());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多