从XMLDocument中提取数据

时间:2018-05-20 10:04:50

标签: c# xml xml-parsing

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetMessage xmlns="http://tempuri.org/">
            <GetMessageResult>
                <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
                        <xs:complexType>
                            <xs:choice minOccurs="0" maxOccurs="unbounded">
                                <xs:element name="inLogSMS">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="InLogID" type="xs:int" minOccurs="0" />
                                            <xs:element name="FromMobile" type="xs:string" minOccurs="0" />
                                            <xs:element name="ContactName" type="xs:string" minOccurs="0" />
                                            <xs:element name="SMSText" type="xs:string" minOccurs="0" />
                                            <xs:element name="ReceiveAt" type="xs:dateTime" minOccurs="0" />
                                            <xs:element name="Status" type="xs:string" minOccurs="0" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:schema>
                <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <NewDataSet xmlns="">
                        <inLogSMS diffgr:id="SMS1" msdata:rowOrder="0">
                            <InLogID></InLogID>
                            <FromMobile></FromMobile>
                            <ContactName></ContactName>
                            <SMSText>Test2</SMSText>
                            <ReceiveAt></ReceiveAt>
                            <Status>New</Status>
                        </inLogSMS>
                        <inLogSMS diffgr:id="SMS2" msdata:rowOrder="1">
                            <InLogID></InLogID>
                            <FromMobile></FromMobile>
                            <ContactName></ContactName>
                            <SMSText>TEST</SMSText>
                            <ReceiveAt></ReceiveAt>
                            <Status>New</Status>
                        </inLogSMS>
                    </NewDataSet>
                </diffgr:diffgram>
            </GetMessageResult>
        </GetMessage>

我已经尝试了几天,任何人都可以告诉我如何提取SMSText元素和状态元素的数据。非常感谢你。标签太多,直到我感到困惑

var responseXml = new XmlDocument();

XmlNodeList items = responseXml.GetElementsByTagName(&#34; / GetMessage / inLogSMS&#34;);             foreach(项目中的XmlNode xItem)             {                 string id = xItem [&#34; SMSText&#34;]。InnerText;                 Console.WriteLine(ID);                 到Console.ReadLine();             }

2 个答案:

答案 0 :(得分:1)

您甚至不需要类似XPath的表达式来访问元素:

XmlDocument responseXml = new XmlDocument();
responseXml.Load("path to your XML");

foreach (XmlElement e in responseXml.GetElementsByTagName("inLogSMS"))
{
    Console.WriteLine("Text: " + e.GetElementsByTagName("SMSText")[0].InnerText);
    Console.WriteLine("Status: " + e.GetElementsByTagName("Status")[0].InnerText);
}


您可以使用XmlDocument而不是XDocument

首先,您需要加载XML;有两种方法可以这样做:
1. XDocument x = XDocument.Parse("your XML as string");
2. XDocument x = XDocument.Load("The path to your XML");

之后,您可以使用Descendants()

访问任何元素

例如:

foreach (var e in x.Descendants("inLogSMS"))
{
    Console.WriteLine("Text: " + e.Element("SMSText").Value);
    Console.WriteLine("Status: " + e.Element("Status").Value);
}

两种方式都会打印出来:

  

文字:Test2
状态:新文字:测试
状态:新

答案 1 :(得分:0)

您正在处理SOAP消息。你没有透露你是如何获得这些内容的,但我希望你没有从WCF Client得到它,因为这样可以解决你的大部分问题。

幸运的是,System.ServiceModel命名空间有很多支持类来处理SOAP消息。

您展示的XML是SOAP信封和Body,其中包含DataSet的包装返回。虽然您可以使用XmlDocument或XDocument,但您可以从提供的标准类中获取该数据。

让我们来看看Message课程如何帮助我们。

它提供了读取SOAP序列化消息的body的方法。

// using System.Runtime.Serialization
// using System.ServiceModel.Channels

GetMessage body; // GetMessage is our custon serialization class
using(var rdr = XmlReader.Create(@"your.xml"))  // or use StringReader / MemoryStream
{
  var msg = Message.CreateMessage(rdr, Int32.MaxValue, MessageVersion.Soap11);
  body = msg.GetBody<GetMessage>();
}
// Now we can simply iterate over the Table
foreach(DataRow smsrow in body.GetMessageResult.Tables["inlogSMS"].Rows)
{
  // and smsrow has the fields in its ItemArray (accessible by its indexer)
  Console.WriteLine("Text: {0} with status {1}", smsrow["SMSText"], smsrow["Status"]);
} 

上面的代码将输出:

  
Text: Test2 with status New
Text: TEST with status New

您需要的序列化类如下所示:

[DataContract(Name="GetMessage", Namespace="http://tempuri.org/")]
public class GetMessage
{
  [DataMember]
  public DataSet GetMessageResult {get;set;} // this will hold the DataSet
}