将XML文件的数据转换为字符串列表C#

时间:2016-03-10 14:23:08

标签: c# xml

这就是XML文件的外观:

<data>
  <subdata>
    <datatype id="1" name="data1">
    <xdim>2</xdim>
    <ydim>1</ydim>
    </datatype>
    <datatype id="2" name="data2">
    <xdim>3</xdim>
    <ydim>4</ydim>
    </datatype>
  </subdata>
</data>

现在,我想要以下内容:

  • 所有数据类型为id&#34; 1&#34;的列表(字符串) &安培; &#34; 2&#34;在上面的预览中
  • 包含所有&lt;的列表(字符串) xdim&gt;喜欢&#34; 2&#34; &安培; &#34; 3&#34;上述
  • 包含所有&lt;的列表(字符串) ydim&gt;喜欢&#34; 1&#34; &安培; &#34; 4&#34;上述

对于像这样的东西,C#中是否有简单的方法?或者任何人都可以帮我解决这个问题吗?

  • 纳斯

6 个答案:

答案 0 :(得分:5)

您可以使用后代方法 此方法读取所有子节点,甚至是节点名称与指定字符串匹配的嵌套节点。

  var Idstring = MyXml.Descendants("datatype").Select (x=>x.Attribute("Id")).ToList();

    var xdimstring = MyXml.Descendants("xdim").Select (x=>x.Value).ToList();

    var ydimstring = MyXml.Descendants("ydim").Select (x=>x.Value).ToList();

安抚你的好奇心:) 这是如何从特定的子数据节点获取节点的。

var Idstring = MyXml.Descendants("Subdata").Descendants("datatype").Select (x=>x.Attribute("Id")).ToList();

    var xdimstring = MyXml.Descendants("Subdata").Descendants("xdim").Select (x=>x.Value).ToList();

    var ydimstring = MyXml.Descendants("Subdata").Descendants("ydim").Select (x=>x.Value).ToList();

现在假设您有多个子数据,并且只想从第一个读取节点...只需使用第一个linq扩展方法

var Idstring = MyXml.Descendants("Subdata").First().Descendants("datatype").Select (x=>x.Attribute("Id")).ToList();

答案 1 :(得分:4)

这很有效,而且相当简洁:

string xml = 
@"<data>
<subdata>
    <datatype id=""1"" name=""data1"">
    <xdim>2</xdim>
    <ydim>1</ydim>
    </datatype>
    <datatype id=""2"" name=""data2"">
    <xdim>3</xdim>
    <ydim>4</ydim>
    </datatype>
</subdata>
</data>";

var xelem = XElement.Parse(xml);

var allIDs = xelem
    .Descendants()
    .Where (x => x.Attribute("id") != null)
    .Select (x => x.Attribute("id").Value)
    .ToList();

var allXdims = xelem
    .XPathSelectElements("//xdim")
    .Select (x => x.Value)
    .ToList();

var allYdims = xelem
    .XPathSelectElements("//ydim")
    .Select (x => x.Value)
    .ToList();

显然,一开始的部分就是将XML转换为XElement。您可能希望这样做:

var xelem = XElement.Load(myXmlLocation);

代替。

答案 2 :(得分:3)

在C#中将类转换为XML和从XML转换类的最简单方法是XML Serialization

对于您的示例,您可以创建一个类,其成员变量对应于XML中的标记。如果要创建XML文件,请将类序列化为XML文件。

当您想要回读信息时,您将XML文件的内容反序列化回您创建的类。

这是一篇更全面的文章:https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx

答案 3 :(得分:1)

        var xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(
            "<data><subdata><datatype id=\"1\" name=\"data1\"><xdim>2</xdim><ydim>1</ydim></datatype><datatype id=\"2\" name=\"data2\"><xdim>3</xdim><ydim>4</ydim></datatype></subdata></data>");
        var nodes = xmlDocument.SelectNodes("//datatype");
        var first = new List<string>();
        var Second = new List<string>();
        var third = new List<string>();
        foreach (XmlNode node in nodes)
        {
            first.Add(node.Attributes["id"].Value);
        }
        nodes = xmlDocument.SelectNodes("//xdim");
        foreach (XmlNode node in nodes)
        {
            Second.Add(node.InnerText);
        }
        nodes = xmlDocument.SelectNodes("//ydim");
        foreach (XmlNode node in nodes)
        {
            third.Add(node.InnerText);
        }

答案 4 :(得分:1)

您可以使用:

XDocument doc = XDocument.Load(@"..\myfile.xml");

将文件加载到XDocument对象中。

然后使用XDocument方法创建所需id值的字符串列表:

var ids = (from a in doc.Descendants("subdata").Elements().Attributes("id")
           select a.Value).ToList();

var xids = (from e in doc.Descendants("datatype").Elements("xdim")
            select e.Value).ToList();

var yids = (from e in doc.Descendants("datatype").Elements("ydim")
            select e.Value).ToList();

答案 5 :(得分:0)

尝试这样的事情

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication81
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<data>" +
                  "<subdata>" +
                    "<datatype id=\"1\" name=\"data1\">" +
                    "<xdim>2</xdim>" +
                    "<ydim>1</ydim>" +
                    "</datatype>" +
                    "<datatype id=\"2\" name=\"data2\">" +
                    "<xdim>3</xdim>" +
                    "<ydim>4</ydim>" +
                    "</datatype>" +
                  "</subdata>" +
                "</data>";

            XElement data = XElement.Parse(xml);
            var results = data.Descendants("subdata").Elements()
                .GroupBy(x => x.Name.LocalName)
                .Select(x => new
                {
                    name = x.Key,
                    value = x.Select(y => (string)y).ToList(),
                    attributes = x.Attributes()
                       .Select(y => new {name = y.Name.LocalName, y.Value})
                       .GroupBy(y => y.name, z => z.Value)
                       .ToDictionary(y => y.Key, z => z.ToList())
                }).ToList();

        }
    }
}