【问题标题】:C# Reading XML tagsC# 读取 XML 标签
【发布时间】:2015-07-05 09:19:32
【问题描述】:

我有 xml 文件,我想读取特定标签的内容。 我知道如何阅读名称标签的内容,但我有地址标签。 它是这样的:

<name>ANdrew</name>
<phone>456778</phone>
<address>Wooden street</address>
<name>John</name>
<phone>758465</phone>
<age>45</age>
<address>Steel street</address>

所以地址标签总是在名字标签之后,但在它们之间有一个电话标签或者其他一些标签,比如年龄...... 现在我需要一个循环来遍历整个文件并收集所有名称和地址。我不知道如何在这个循环中关联名称和地址....

【问题讨论】:

  • 您也可以使用条件 if/else。例如,如果节点类型是地址,那么做一些事情

标签: c# xml


【解决方案1】:

如果你有这样的xml:

<Names>
<Name>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
</Name>
<Name>
    <FirstName>James</FirstName>
    <LastName>White</LastName>
</Name>

您可以使用此代码:

    XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString); // suppose that myXmlString contains "<Names>...</Names>"

XmlNodeList xnList = xml.SelectNodes("/Names/Name");
foreach (XmlNode xn in xnList)
{
  string firstName = xn["FirstName"].InnerText;
  string lastName = xn["LastName"].InnerText;
  Console.WriteLine("Name: {0} {1}", firstName, lastName);
}

【讨论】:

  • 好的,我明白了,它看起来不错,但是如果我的 xml 中没有父标签,它会起作用吗?所以我没有名字,然后是名字。 xml 文件中的标签就像我没有提供父标签一样..
  • 使用 xml.Load 而不是 LoadXml。我得到“根级别的数据无效。第 1 行,位置 1。”尝试使用 LoadXml 方法加载 xml 时出错。
【解决方案2】:

使用 XPath 选择您需要的节点

var nodes = document.SelectNodes("//root/name")

您可以对地址执行相同操作,然后遍历节点集合

【讨论】:

  • 好的,所以我将在 var 节点中拥有所有名称,在 var 节点 2 中拥有所有地址,但是我如何知道哪个地址属于哪个名称?
【解决方案3】:

你可以用 Linq to XML 查询它(虽然这个 xml 格式应该不同):

string xml = @"<Names>
                   <name>ANdrew</name>
                   <phone>456778</phone>
                   <address>Wooden street</address>
                   <name>John</name>
                   <phone>758465</phone>
                   <age>45</age>
                   <address>Steel street</address>
               </Names>";

XDocument doc = XDocument.Parse(xml);
var names = doc.Root.Elements("name").Select(n => n.Value);
var addresses = doc.Root.Elements("address").Select( a => a.Value);

var results = names.Zip(addresses, (name, address) => name + " has the following address: " + address);

foreach (var r in results)
    Console.WriteLine(r);  // ANdrew has the following address: Wooden street
                           // John has the following address: Steel street

【讨论】:

    【解决方案4】:

    我通过 DataSet 或数据表集合阅读 xml 文档。 string xmlPath = "C:\blabla.xml"; StreamReader streamRead = new StreamReader(xmlPath) byte[] fullByte = Encoding.ASCII.GetBytes(streamRead.ReadToEnd()); DataSet dataSet = new DataSet(); MemoryStream mStream = new MemoryStream(fullByte); dataSet.ReadXml(mStream);

    【讨论】:

      【解决方案5】:

      使用 LINQ to XML,您可以选择 name 元素,然后访问 ElementsAfterSelf("address").First(),例如

                  XDocument doc = XDocument.Parse(@"<root><name>ANdrew</name>
      <phone>456778</phone>
      <address>Wooden street</address>
      <name>John</name>
      <phone>758465</phone>
      <age>45</age>
      <address>Steel street</address>
      </root>");
                  foreach (XElement name in doc.Root.Elements("name"))
                  {
                      Console.WriteLine("{0}: {1}", (string)name, (string)name.ElementsAfterSelf("address").First());
                  }
      

      当然,如果您有 XML 文件,请使用 XDocument.Load("input.xml") 而不是 Parse。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        相关资源
        最近更新 更多