c# - 以标准方式访问没有值(value)的短信 Web 服务中的子 XML 值

标签 c# .net xml xml-parsing

我有以下 xml:

像这样的其他标准 xml question在这里我们没有问题,但在 php web 服务中:

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>

为此我写了下面的代码

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");
                }
            }
        }

和这段代码

    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)
    {

但无法捕获此 xml 文档中的值。

有没有一种干净的方法来做到这一点?

最佳答案

对于这类事情,使用内置的序列化器更容易,比如 XmlSerializerDataContractSerializer .我使用了后者并使用以下代码片段测试了您的 XML。

第一个annotate您的 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; }
}

然后为您的 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

关于c# - 以标准方式访问没有值(value)的短信 Web 服务中的子 XML 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122799/

相关文章:

c# - 如何将时基轮询与等待任务结合起来

c# - 在sql server中获取唯一值

c# - 代码中的访问冲突不是我的

.net - 确定图像的文件类型

java - 无法使用 Vuforia 解析文件 qcar_config.xsd

java - OpenID Connect 的 Spring Security 5 XML 配置

c# - VB.NET 应用程序中的脚本自动化

c# - 在 Monodroid/C# 中将 AsyncTask 转换为任务

c# - 父任务不等待子任务

java - 如何告诉 Java SAX 解析器忽略无效字符引用?