以标准方式访问sms Web服务中没有值的子XML值

sab*_*zdi 7 .net c# xml xml-parsing

我有以下xml:

在其他标准的xml像这个问题这里我们没有问题,但在PHP网络服务:

http://sandoghche.com/WebService

收件箱检查我的收件箱xml是这样的:

<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<Result>
  <text_message>
    <id>509</id>
    <message><![CDATA[a]]></message>
    <time>1323519941</time>
    <message_phone>
      <cellphone>09196070718</cellphone>
    </message_phone>
  </text_message>
  <text_message>
    <id>507</id>
    <message>1</message>
    <time>1323519803</time>
    <message_phone>
      <cellphone>09360437392</cellphone>
    </message_phone>
  </text_message>
  <text_message>
    <id>303</id>
    <message><![CDATA[smsm text]]></message>
    <time>1318343296</time>
    <message_phone>
      <cellphone>09354338365</cellphone>
    </message_phone>
  </text_message>
  <text_message>
    <id>219</id>
    <message><![CDATA[my sms texts here]]></message>
    <time>1316154042</time>
    <message_phone>
      <cellphone>09127930265</cellphone>
    </message_phone>
  </text_message>
  <text_message>
    <id>217</id>
    <message>2</message>
    <time>1316090189</time>
    <message_phone>
      <cellphone>09195533234</cellphone>
    </message_phone>
  </text_message>
</Result>
Run Code Online (Sandbox Code Playgroud)

为此,我写了以下代码

public class SMSData
{
    public int id { set; get; }
    public string message { set; get; }
    public string cellphone { set; get; }
}



  string data = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Result><text_message><id>509</id><message><![CDATA[a]]></message><time>1323519941</time><message_phone><cellphone>09196070718</cellphone></message_phone></text_message><text_message><id>507</id><message>1</message><time>1323519803</time><message_phone><cellphone>09360437392</cellphone></message_phone></text_message><text_message><id>303</id><message><![CDATA[?????.????]]></message><time>1318343296</time><message_phone><cellphone>09354378365</cellphone></message_phone></text_message><text_message><id>219</id><message><![CDATA[???? ???? ???????? ???? ????? ?? ???? ???? ?? ????? ??? ???? ????? ?? ??? ?? ?????? ????]]></message><time>1316154042</time><message_phone><cellphone>09127960265</cellphone></message_phone></text_message><text_message><id>217</id><message>2</message><time>1316090189</time><message_phone><cellphone>09195523234</cellphone></message_phone></text_message></Result>";

    Stream s = GenerateStreamFromString(data);

    XmlReader xr = XmlReader.Create(s);

        while (xr.Read())
        {
            if ((xr.NodeType == XmlNodeType.Element) && (xr.Name == "text_message"))
            {
                if (xr.HasValue)
                {
                    string id = xr.GetAttribute("id");
                    string message = xr.GetAttribute("message");
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

和这段代码

    Dictionary<int, string> myDictionary = new Dictionary<int, string>();
    XmlDocument xml = new XmlDocument();
    xml.LoadXml(data);
    XmlNodeList xnList = xml.SelectNodes("/Result");

    foreach (XmlNode xn in xnList)
    {
Run Code Online (Sandbox Code Playgroud)

但无法捕获此xml文档的值.

有干净的方法吗?

ren*_*ene 7

对于这类东西,比如XmlSerializerDataContractSerializer,更容易使用内置的Serializer .我使用后者并使用以下代码段测试您的XML.

首先注释您的SMSData类并创建一个新类,以将Message_phone元素保存在新类中:

[DataContract(Name="text_message",Namespace = "")]
public class SMSData
{
    [DataMember(Order =1)]
    public int id { set; get; }    
    [DataMember(Order = 2)]
    public string message { set; get; }
    [DataMember(Order = 3)]
    public int time { set; get; }
    [DataMember(Order = 4)]
    public Message_phone message_phone { set; get; }

     // for easy access to cellphone
        public string cellphone {
            get 
            {
                 return message_phone!=null?message_phone.cellphone:null;
            }
        }
}


[DataContract(Name="message_phone",Namespace = "")]
public class Message_phone
{
    [DataMember]
    public string cellphone { set; get; }
}
Run Code Online (Sandbox Code Playgroud)

然后为您的SMSData数组创建一个DataContractSerializer实例,并在其上调用ReadObject,如下所示:

Stream s = GenerateStreamFromString(data);

var ds = new DataContractSerializer(
               typeof(SMSData[]),   // array of SMSdata
               "Result",            // top level element
               "",                  // empty namespace
               new List<Type> { typeof(SMSData[])} );    

var smsdata = (SMSData[]) ds.ReadObject(XmlReader.Create(s));

// smsdata now holds the SMSData from the Xml file
Run Code Online (Sandbox Code Playgroud)