【问题标题】:Read a XML (from a string) and get some fields - Problems reading XML读取 XML(从字符串)并获取一些字段 - 读取 XML 的问题
【发布时间】:2012-01-14 03:15:36
【问题描述】:

我有这个 XML(存储在一个名为 myXML 的 C# 字符串中)

<?xml version="1.0" encoding="utf-16"?>
<myDataz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <listS>
    <sog>
      <field1>123</field1>
      <field2>a</field2>
      <field3>b</field3>
    </sog>
    <sog>
      <field1>456</field1>
      <field2>c</field2>
      <field3>d</field3>
    </sog>
  </listS>
</myDataz>

我想浏览所有&lt;sog&gt; 元素。对于他们每个人,我想打印孩子&lt;field1&gt;

这是我的代码:

XmlDocument xmlDoc = new XmlDocument();
string myXML = "<?xml version=\"1.0\" encoding=\"utf-16\"?><myDataz xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><listS><sog><field1>123</field1><field2>a</field2><field3>b</field3></sog><sog><field1>456</field1><field2>c</field2><field3>d</field3></sog></listS></myDataz>"
xmlDoc.Load(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("listS");
foreach (XmlNode childrenNode in parentNode)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}

但似乎我无法将字符串读取为 XML?我得到System.ArgumentException

【问题讨论】:

  • 异常说明了什么
  • 你能在 .NET 4.0 中使用 XDocument 吗?
  • 我使用的是 .NET 3.5!我写了异常!
  • 什么是异常消息
  • XLINQ 在 .Net 3.5 上得到完全支持,并且更易于使用。

标签: c# .net xml parsing xml-parsing


【解决方案1】:

你应该使用 LoadXml 方法,而不是 Load:

xmlDoc.LoadXml(myXML); 

Load 方法试图从文件中加载 xml 并从字符串中加载 LoadXml。你也可以使用 XPath:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

string xpath = "myDataz/listS/sog";
var nodes = xmlDoc.SelectNodes(xpath);

foreach (XmlNode childrenNode in nodes)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
} 

【讨论】:

  • 非常简单。最后我可以开始使用 API 了 :)。
  • 应该是SelectSingleNode("//field1").InnerTextSelectSingleNode("//field1").InnerXml 而不是SelectSingleNode("//field1").Value,因为它不是属性,而是标签之间的值。
【解决方案2】:

使用 Linq-XML,

XDocument doc = XDocument.Load(file);

var result = from ele in doc.Descendants("sog")
              select new
              {
                 field1 = (string)ele.Element("field1")
              };
 foreach (var t in result)
  {
      HttpContext.Current.Response.Write(t.field1);
  }

OR : 获取&lt;sog&gt;标签的节点列表。

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(myXML);
 XmlNodeList parentNode = xmlDoc.GetElementsByTagName("sog");
 foreach (XmlNode childrenNode in parentNode)
  {
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("field1").InnerText);
   }

【讨论】:

    【解决方案3】:

    其他答案已经有好几年了(并且不适用于 Windows Phone 8.1),所以我想我会选择另一个选项。我用它来解析 Windows Phone 应用程序的 RSS 响应:

    XDocument xdoc = new XDocument();
    xdoc = XDocument.Parse(xml_string);
    

    【讨论】:

      【解决方案4】:

      或者使用 XmlSerializer 类。

      XmlSerializer xs = new XmlSerializer(objectType);
      obj = xs.Deserialize(new StringReader(yourXmlString));
      

      【讨论】:

        【解决方案5】:

        为此,我使用了 System.Xml.Linq.XElement。只需检查下面的代码以读取 xml 的第一个子节点(不是根节点)的值。

                string textXml = "<xmlroot><firstchild>value of first child</firstchild>........</xmlroot>";
                XElement xmlroot = XElement.Parse(textXml);
                string firstNodeContent = ((System.Xml.Linq.XElement)(xmlroot.FirstNode)).Value;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          • 2016-09-25
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 2012-10-19
          相关资源
          最近更新 更多