C# 从XML文档中提取数据
我已经尝试了好几天,任何人都可以告诉我如何提取SMSText元素和Status元素的数据。非常感谢你。标签太多了,我弄糊涂了 var responseXml=新的XmlDocument XmlNodeList items=responseXml.GetElementsByTagName/GetMessage/inLogSMS; 项中的foreach XmlNode xItem { 字符串id=xItem[SMSText].InnerText; Console.WriteLineid; Console.ReadLine;C# 从XML文档中提取数据,c#,xml,xml-parsing,C#,Xml,Xml Parsing,我已经尝试了好几天,任何人都可以告诉我如何提取SMSText元素和Status元素的数据。非常感谢你。标签太多了,我弄糊涂了 var responseXml=新的XmlDocument XmlNodeList items=responseXml.GetElementsByTagName/GetMessage/inLogSMS; 项中的foreach XmlNode xItem { 字符串id=xItem[SMSText].InnerText; Console.WriteLineid; Conso
}您甚至不需要类似XPath的表达式来访问元素:
<?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>
您可以使用XDocument而不是XmlDocument
首先,您需要加载XML;有两种方法可以做到这一点:
1.XDocument x=XDocument.XML解析为字符串;
2.XDocument x=XDocument.loadXML的路径
之后,您可以使用子体访问任何元素
例如:
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);
}
两种方式都将打印:
文本:Test2状态:新建文本:测试状态:新建
您正在处理一条SOAP消息。你没有透露你是如何得到这些内容的,但我想你并不是从一个网站上得到的,因为这会解决你大部分的问题 幸运的是,名称空间有很多支持类来处理SOAP消息 您显示的XML是一个SOAP信封和一个数据集的包装返回体。虽然您可以随意处理XmlDocument或XDocument,但您可以从提供的标准类中获取这些数据 让我们看看这门课能如何帮助我们 它提供了读取SOAP序列化消息的方法
foreach (var e in x.Descendants("inLogSMS"))
{
Console.WriteLine("Text: " + e.Element("SMSText").Value);
Console.WriteLine("Status: " + e.Element("Status").Value);
}
您需要的序列化类如下所示:
// 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"]);
}
[DataContract(Name="GetMessage", Namespace="http://tempuri.org/")]
public class GetMessage
{
[DataMember]
public DataSet GetMessageResult {get;set;} // this will hold the DataSet
}