如何使用XMLDocument类在C#中从XML文件中获取数据?

3

大家晚上好,祝你们周末愉快!

我一整天都在试图理解如何解析我的简单XML文件,以便我足够理解它并能写出我想要的个人项目。

我已经阅读了本网站和其他网站上的文章,但仍然无法超越当前的困境 :(

我的XML文档是...

<XML>
  <User>
    <ID>123456789</ID>
    <Device>My PC</Device>
  </User>
  <History>
    <CreationTime>27 June 2013</CreationTime>
    <UpdatedTime>29 June 2013</UpdatedTime>
    <LastUsage>30 June 2013</LastUsage>
    <UsageCount>103</UsageCount>
  </History>
  <Configuration>
    <Name>Test Item</Name>
    <Details>READ ME</Details>
    <Enabled>true</Enabled>   
  </Configuration>
</XML>

我正在尝试获取细节元素(README)中的值。以下是我的代码:

// Start Logging Progress
Console.WriteLine("Test Application - XML Parsing and Creating");
Console.ReadKey();

// Load XML Document
XmlDocument MyDoc = new XmlDocument();  MyDoc.Load(@"E:\MyXML.XML");

// Select Node
XmlNode MyNode = MyDoc.SelectSingleNode("XML/Configuration/Details");

// Output Node Value
Console.WriteLine(String.Concat("Details: ", MyNode.Value));

// Pause
Console.ReadKey();

我的控制台应用程序正在运行并输出"Target:",但没有给我该元素的详细信息。

有人能看出这是为什么吗?如果我完全不了解XML文件的阅读,能否给我建议呢?这就是我现在的情况 :)

谢谢!汤姆

4个回答

5
使用您的XPATH表达式
// Select Node
XmlNode MyNode = MyDoc.SelectSingleNode("XML/Configuration/Details");

你正在选择一个元素,因此MyNode的类型将是XmlElement,但是XmlElementValue始终为null(请参见MSDN),因此您需要使用XmlElement.InnerTextXmlElement.InnerXml

因此,您需要更改代码为

// Output Node Value
Console.WriteLine(String.Concat("Details: ", MyNode.InnerText));

或者您可以使用XPATH text() 函数选择元素的内容,在这种情况下,MyNode将是 XmlText,您可以使用 Value 获取其值:

// Select Node
XmlNode MyNode = MyDoc.SelectSingleNode("XML/Configuration/Details/text()");

// Output Node Value
Console.WriteLine(String.Concat("Details: ", MyNode.Value));

作为一个旁注,如果你正在学习C#中的XML操作,你应该查看LINQ to XML,这是另一种在C#中处理XML的新方法。

嗨Nemesv,感谢你的回复; 看起来这似乎可以正确获取文本。我也会看一下LINQ to XML,看看应该选择哪一个。看起来社区在3种不同的方法上有所分歧。我之所以选择这种方法的想法是因为我不需要拉回大型XML文件,因此不需要增加复杂性。而且知道Microsoft在过去(XNA 咳嗽)的做法,我对依赖于他们的新技术感到很紧张,因为它们可能会发生根本性的变化或消失:( - user1117617

0

仅供参考,一个鲜为人知的“简单”语法是:

XmlDocument myDoc = new XmlDocument();
myDoc.Load(@"D:\MyXML.XML");

string details = myDoc["XML"]["Configuration"]["Details"].InnerText;

请注意,如果您的XML不符合您期望的结构,那么这种方法(以及XPath方法)可能会出现问题,因此最好在其中加入一些验证。

0
你可以使用XPath库来实现(必须包含“System.Xml.XPath”):
 XmlDocument document = new XmlDocument();
         document.Load("MyXml.xml");
         XPathNavigator navigator = document.CreateNavigator();

        foreach (XPathNavigator nav in navigator.Select("//Details"))
         {
             Console.WriteLine(nav.Value);

        }

上述代码遍历名为(Details)的每个节点,提取信息并打印出来。


0

如果你想从一个XML文件中检索特定的值

 XmlDocument _LocalInfo_Xml = new XmlDocument();
            _LocalInfo_Xml.Load(fileName);
            XmlElement _XmlElement;
            _XmlElement = _LocalInfo_Xml.GetElementsByTagName("UserId")[0] as XmlElement;
            string Value = _XmlElement.InnerText;

Value 包含文本值


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