0

这听起来可能是一个非常基本的问题,但就是这样。我在 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#,任何人都可以从他们宝贵的时间中抽出几分钟来指导我,将非常感激

4

4 回答 4

5

我会在这里使用 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;
于 2012-08-15T14:49:40.670 回答
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;
于 2012-08-15T14:49:09.887 回答
0

我更喜欢 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;

ETC...

于 2012-08-15T14:49:39.123 回答
-1

在 Xml 和 C# 类之间序列化/反序列化非常容易:

http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

您基本上创建了一个包含 Xml 的元素和属性的类,将 [XmlElement] 和 [XmlAttribute] 属性粘贴到它们上,然后使用XmlSerializer.

还有其他选择;您已经提到XmlReader需要大量工作/维护,并且通常仅用于大型文档。到目前为止,我看到的其他答案使用易于使用且不使用此类代理类的更高抽象级别的阅读器。我想这是一个偏好问题。

于 2012-08-15T14:49:55.103 回答