【问题标题】:How to get value from a specific child element in XML using XmlReader?如何使用 XmlReader 从 XML 中的特定子元素中获取值?
【发布时间】:2013-09-24 07:59:24
【问题描述】:

这是 XML 字符串。

<?xml version="1.0" encoding="utf-16"?>
<questionresponses>
  <question id="dd7e3bce-57ee-497a-afe8-e3d8d25e2671">
    <text>Question 1?</text>
    <response>abcdefg</response>
    <correctresponse>123</correctresponse>
  </question>
  <question id="efc43b1d-048f-4ba9-9cc0-1cc09a7eeaf2">
    <text>Question 2?</text>
    <response>12345678</response>
    <correctresponse>123</correctresponse>
  </question>
</questionresponses>

那么我如何通过给定的问题 ID 获得 &lt;response&gt; 元素的值?比如说,如果我给 id value = "dd7e3bce-57ee-497a-afe8-e3d8d25e2671",我想返回字符串值 abcdefg 作为结果。

var xmlstr = "content from above xml example";
using (var reader = XmlReader.Create(new StringReader(xmlstr)))
{
    while(reader.Read())
    {
        if(reader.IsStartElement())
        {
            var attr = reader["id"];
            if(attr != null && attr == "dd7e3bce-57ee-497a-afe8-e3d8d25e2671")
            {
                if(reader.ReadToDescendant("response"))
                {
                    result = reader.Value; // <= getting empty string? So what's wrong?
                    break;
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# .net xml xmlreader


    【解决方案1】:

    你可能需要这样做,我认为问题是阅读器没有转向文本,因此你变得空虚

            if(reader.ReadToDescendant("response"))
                {
                    reader.Read();//this moves reader to next node which is text 
                    result = reader.Value; //this might give value than 
                    break;
                }
    

    上面一个对我有用,你可以在最后尝试一下

    【讨论】:

    • 是的,确实,我错过了 reader.Read() 这就是 reader.Value 为空的原因。感谢您迅速指出这一点。
    • 你能看到我的question 之一关于 xml 响应吗?
    • 这里需要break;吗?
    【解决方案2】:

    我会使用 LINQ2XML..

    XDocument doc=XDocument.Parse(xmlstr);
    String response=doc.Elements("question")
                       .Where(x=>x.Attribute("id")==id)
                       .Single()
                       .Element("response")
                       .Value;
    

    【讨论】:

      【解决方案3】:

      您可以使用此函数从存储在 QuestionXML.xml 中的 XML 中获取特定问题的响应。

      private string getResponse(string questionID)
                  {
                      string response = string.Empty;
                      using (StreamReader sr = new StreamReader("QuestionXML.xml", true))
                      {
                          XmlDocument xmlDoc1 = new XmlDocument();
                          xmlDoc1.Load(sr);
                          XmlNodeList itemNodes = xmlDoc1.GetElementsByTagName("question");
                          if (itemNodes.Count > 0)
                          {
                              foreach (XmlElement node in itemNodes)
                              {
                                  if (node.Attributes["id"].Value.ToString() == questionID.Trim())
                                  {
                                      response = node.SelectSingleNode("response").InnerText;
                                      break;
                                  }
      
                              }
                          }
                      }
                      return response;
                  }
      

      【讨论】:

        【解决方案4】:
        if (reader.NodeType == XmlNodeType.Element)
        {
            if(reader.Name == "response")
            {
                reader.read();
                var res = reader.Value;
            }
        } 
        

        //它对我有用!!!!

        【讨论】:

          猜你喜欢
          • 2016-12-03
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 1970-01-01
          • 2021-09-03
          • 1970-01-01
          • 2018-11-30
          • 2018-05-24
          相关资源
          最近更新 更多