如何在 C# 中读取 XML
Posted
技术标签:
【中文标题】如何在 C# 中读取 XML【英文标题】:How to Read XML In in C# 【发布时间】:2012-08-15 14:42:31 【问题描述】:这听起来可能是一个非常基本的问题,但就是这样。我在 DOM 中加载了这个示例 XML
<message from="fromvalue" to="tovalue" xml:lang="en" type="chat">
<thread>fe422b47-9856-4404-8c35-5ff45e43ee01</thread>
<body>Test buddy</body>
<active xmlns="http://XXXX.org/protocol/chatstates" />
</message>
这是我使用以下代码从请求正文收到的
StreamReader reader = new StreamReader ( HttpContext.Request.InputStream, System.Text.Encoding.UTF8 );
string sXMLRequest = reader.ReadToEnd ( );
XmlDocument xmlRequest = new XmlDocument ( );
xmlRequest.LoadXml ( sXMLRequest );
现在我只需要三个不同变量中的三样东西的值
string bodytext = body element inner text
string msgfrom = from attribute value of message element
string msgto = to attribute value of message element
我正在使用 C#,任何人都可以从他们宝贵的时间中抽出几分钟来指导我,将不胜感激
【问题讨论】:
尝试了不同的东西,但最后总是失望,包括 xmlreader 和其他一些东西,:( 请将您尝试过的内容和结果添加到您的问题中。 【参考方案1】:我会在这里使用 LINQ to XML - 它要简单得多:
XDocument doc = XDocument.Load(HttpContext.Request.InputStream);
string bodyText = (string) doc.Root.Element("body");
string fromAddress = (string) doc.Root.Attribute("from");
string toAddress = (string) doc.Root.Attribute("to");
对于任何不存在的元素/属性,这将为您提供 null
的值。如果您对 NullReferenceException 感到满意:
XDocument doc = XDocument.Load(HttpContext.Request.InputStream);
string bodyText = doc.Root.Element("body").Value;
string fromAddress = doc.Root.Attribute("from").Value;
string toAddress = doc.Root.Attribute("to").Value;
【讨论】:
也谢谢你,虽然我已经采用第一个答案作为我的解决方案,但仍然感谢你的时间和精力以及正确的解决方案 @VikasChawla:请注意,使用XDocument.Load
意味着您不需要假设请求流将是 UTF-8。只要文档声明了适当的编码,就可以了。【参考方案2】:
您可以使用 XDocument
,这是 .NET 3.5 中引入的新 XML 解析器:
XDocument doc = XDocument.Parse(sXMLRequest);
string bodytext = doc.Element("message").Element("body").Value;
string msgfrom = doc.Element("message").Attribute("from").Value;
string msgto = doc.Element("message").Attribute("to").Value;
【讨论】:
Parse 和 Load 有什么区别?Load
需要流、阅读器或文件名。 Parse
需要一个已经表示 XML 的字符串,这是 OP 已经拥有的。
@DarinDimitrov:OP 已经通过做不必要的工作和假设 UTF-8 拥有它。使用 Load
意味着总代码更少,面对非 UTF-8 文档的可靠性更高,IMO。【参考方案3】:
我更喜欢 XLINQ,但是在您的示例中:
XmlNode thread_node = xmlRequest.SelectSingleNode("/message/thread");
Guid thread = thread_node.InnerText;
XmlNode body_node = xmlRequest.SelectSingleNode("/message/body");
string body= body_node.InnerText;
等等……
【讨论】:
也谢谢你,虽然我已经采用第一个答案作为我的解决方案,但仍然感谢你的时间和精力以及正确的解决方案【参考方案4】:在 Xml 和 C# 类之间序列化/反序列化非常容易:
http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization
您基本上创建了一个包含 Xml 的元素和属性的类,将 [XmlElement] 和 [XmlAttribute] 属性粘贴到它们上,并使用XmlSerializer
。
还有其他选择;您已经提到的XmlReader
需要大量工作/维护,并且通常仅用于大型文档。到目前为止,我看到的其他答案使用易于使用且不使用此类代理类的更高抽象级别的阅读器。我想这是一个偏好问题。
【讨论】:
愿意分享为什么这被否决了吗?我没有从投票中学到任何东西。 IMO 可能是因为序列化在此过于矫枉过正。以上是关于如何在 C# 中读取 XML的主要内容,如果未能解决你的问题,请参考以下文章