如何使用C#获取XML根节点?

55

我知道如果你知道节点名称,可以使用C#获取任何XML节点,但我想获取根节点以便找到名称。这可能吗?

更新:我正在使用XMLTextReader读取文件的URL,然后将其加载到XMLDocument对象中。基本上,我正在尝试避免使用LINQ to XML,但如果有其他更好的方法,我一直都是一个好学生。


1
你是怎么获取XML文档的? - Oded
1
你使用什么来解析XML? - Denis Palnitsky
5个回答

90

根节点是XmlDocumentDocumentElement属性

XmlElement root = xmlDoc.DocumentElement

如果你只有一个节点,你可以通过以下方法获取根节点:

XmlElement root = xmlNode.OwnerDocument.DocumentElement

谢谢。我会尝试一下。另外,如果XmlDocument的根是.DocumentElement,那么根的任何子元素都将是root.DocumentElement吗? - Piers Karsenbarg
1
不,.DocumentElement只是XmlDocument的一个属性,而根节点的子节点是xmlNode,因此它们没有这个属性。这就是为什么要使用.OwnerDocument来获取根节点的原因。 - CharlesB
太棒了!我无法感谢你足够,@CharlesB救了我!希望我能多次点赞这个答案。 - async

27

我在这里也有同样的问题。如果文档很大,使用XmlDocument不是一个好主意。事实上,第一个元素就是根元素,基于这个可以使用XmlReader获取根元素。使用XmlReader比使用XmlDocument效率更高,因为它不需要将整个文档加载到内存中。

  using (XmlReader reader = XmlReader.Create(<your_xml_file>)) {
    while (reader.Read()) {
      // first element is the root element
      if (reader.NodeType == XmlNodeType.Element) {
        System.Console.WriteLine(reader.Name);
        break;
      }
    }
  }

非常好!非常简洁高效。 - Suncat2000

17

同意Jewes的观点,使用XmlReader是更好的选择,特别是当处理较大的XML文档或在循环中处理多个文档时 - 如果你只需要文档根节点,就不需要解析整个文档。

以下是一种简化版本,使用XmlReader和MoveToContent()。

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.movetocontent.aspx

using (XmlReader xmlReader = XmlReader.Create(p_fileName))
{
  if (xmlReader.MoveToContent() == XmlNodeType.Element)
    rootNodeName = xmlReader.Name;
}

1
请说明如果 if 语句失败意味着什么。 - John Saunders
如果if从未触发,则文件内容没有元素。它将读取文件的末尾,并且rootNodeName将不会被设置。 - WestDiscGolf
这是正确的。为了进一步处理,您可能会遇到解析XML的问题,因为它不是良好形式的或者可能有DTD声明(顺便提一下,您可以使用XmlReaderSettings禁用它- http://msdn.microsoft.com/en-us/library/z2adhb2f(v=VS.100).aspx等),因此您应该将整个解析过程包装在try-catch中,以防万一,但那将是一个不同的主题,是的,测试空白或空根节点名称(String.IsNullOrEmpty()方法)。 - Dan Dar3

1
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(response.GetResponseStream());
string rootNode = XmlDoc.ChildNodes[0].Name;

@nesomis 谢谢 - 你的回答对我很有帮助。小提示:ChildNodes是一个属性。 - user3230660

0

试试这个

XElement root = XDocument.Load(fStream).Root;

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jesus is Lord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接