【问题标题】:How would I parse an XML file into a list我如何将 XML 文件解析为列表
【发布时间】:2017-11-16 21:00:30
【问题描述】:

列表:


List<string> list = new List<string>();

XML 文件:


<memberlist>
 <member>
  <name>Name</name>
  <status>Status</status>
 </member>
</memberlist>

我将如何解析这个文件,比如说 (file.xml) 到列表中?

我尝试了很多方法,但似乎都没有奏效。

我想查看状态是否为“gold”,如果是,我想将该成员的名称放入列表中。

【问题讨论】:

  • 您的 xml 描述了一个层次结构,您希望最终在列表中得到什么?显示预期结果。
  • 看看xml-to-list

标签: c# xml visual-studio


【解决方案1】:

将 xml 加载到 XDocument。您可以从文件中执行此操作,我已经从字符串中进行了演示。

对名为“status”(在“member”内)且值为“gold”的元素执行 linq 查询。

其中,获取“name”元素的值。

在您的字符串列表中使用AddRange

List<string> lstGolds = new List<string>();

string xml ="<memberlist><member><name>Name</name><status>gold</status></member></memberlist>";
XDocument doc = XDocument.Parse(xml);

var goldStatus = doc.Descendants("member")
    .Where(d => d.Element("status").Value == "gold")
    .Select(d => d.Element("name").Value);

lstGolds.AddRange(goldStatus);

【讨论】:

    【解决方案2】:

    您应该使用 System.Xml.Linq;

    using (FileStream fileStramWrite = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))   
     using (StreamReader streamReader = new StreamReader(fileStramWrite))
                        {
                            var xdoc = XDocument.Load(streamReader);
                            var xElement = xdoc.Element("memberlist");
                            var xElement2 = xElement.Element("member");
                            var name = xElement2.Element("name").Value;
                            var status = xElement2.Element("status").Value;
                        }
    

    【讨论】:

    • 如果你有很多成员,那就这样做: IEnumerable members= xElement.Elements("memberlist"); foreach(成员中的 XElement 成员){ list.Add(member.Element("name")); }
    • 它不起作用。我收到错误消息...无法将 System.Xml.Linq.XElement 从...隐式转换为 System.Xml.Linq.XDocument... XDocument xElement = xdoc.Element("memberlist"); XDocument xElement2 = xElement.Element("member");
    • 还是不行。所有变量都返回 null。
    【解决方案3】:

    将您的 XML 转换为对象列表......

    使用这两种方法:

    public static string Serialize<T>(T dataToSerialize)
    {
        try
        {
            var stringwriter = new ISOEncodingStringWriter();
            var serializer = new XmlSerializer(typeof(T));
    
            var xns = new XmlSerializerNamespaces();
            xns.Add(string.Empty, string.Empty);
    
            serializer.Serialize(stringwriter, dataToSerialize, xns);
            return stringwriter.ToString();
        }
        catch
        {
            throw;
        }
    }
    
    public static T Deserialize<T>(string xmlText)
    {
        try
        {
            var stringReader = new System.IO.StringReader(xmlText);
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
        catch
        {
            throw;
        }
    }
    

    在您提供以下属性的地方创建以下类

    [XmlRoot(ElementName = "Members", Namespace = "")]
    public class Members
    {
        [XmlElement("Member")]
        public Member[] member { get; set; }
    }
    
    public class Member
    {
        [XmlElementAttribute("Name")]
        public string Name { get; set; }
    
        [XmlElementAttribute("Status")]
        public string Status { get; set; }
    }
    

    然后反序列化您的数据。

    Members result = Deserialize<Members>(XML_String);
    

    您将成员放在一个数组中,如果需要,您可以将其转换为列表。

    【讨论】:

      【解决方案4】:

      你可以使用 LINQ

      XElement xml = XElement.Load("locationToYourXmlFile");
      
      var members = xml.Elements("member");
      var list  = members.Where(member => member.Element("status")?.Value == "Gold")
                         .Select(member => member.Element("name")?.Value)
                         .ToList();
      

      假设您的 XML 在根 memberlist 元素下有一堆成员元素,每个元素里面都有一个 namestatus 元素。

      <?xml version="1.0" encoding="utf-8"?>
      <memberlist>
          <member>
              <name>John</name>
              <status>Gold</status>
          </member>
          <member>
              <name>Sam</name>
              <status>Silver</status>
          </member>
          <member>
              <name>Sara</name>
              <status>Gold</status>
          </member>
      </memberlist>
      

      【讨论】:

        猜你喜欢
        • 2015-05-03
        • 1970-01-01
        • 2014-12-25
        • 2017-08-07
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        相关资源
        最近更新 更多