如何在子节点具有相同名称的地方解析XML

时间:2020-07-07 01:52:45

标签: c# xml xml-parsing

我有一个要解析的XML文件,遇到了一个具有其自己的子节点的特定元素。 XML文件如下:

<status.AppleSettings>
    <AppleInstance MaxCost="250" Status="77" NewMode="5" SharePrice="350"
                   FlagTF="False" TimeClock="0" TimeClockSec="14"
                   Options="7532890" ID="JK_7755" Owner="SLP90"
                   Server="PA.SL90.COL" Name="SLP90" GroupName="COL.PA"
                   Instance="AppleServiceInstance" NewFlag="True" FinalCount="0"/>
    <AppleInstance MaxCost="5" Status="0" NewMode="1" SharePrice="0"
                   FlagTF="False" TimeClock="300" TimeClockSec="1000"
                   Options="56794577431" Owner="A.CON" Instance="SL91"
                   NewFlag="True" FinalCount="1" List="1450, 1430"
                   Keyrepo="SYSTEMSERVER_7671902"/>
</status.AppleSettings>

如您所见,有一个父节点-AppleSettings,然后是两个具有相同名称的子节点-AppleInstance。我为子节点创建了两个单独的类,因为它们具有不同的属性。我可以访问AppleSettings,当我进行快速观察时,我可以看到其中的两个子节点,只是无法弄清楚如何访问它们。 XML解析和C#的新功能,因此一切都是反复试验,可以从stackoverflow中学到很多东西。

这是我访问AppleSettings父节点所需的代码:

    private List<Data> GetAppleSettingsNode(List<XmlDocument> XMLdocument, List<Data> DataList)
    {
        for (int i = 0; i < XMLdocument.Count(); i++)
        {
              AppleSettings temp = new AppleSettings();

              var temp2 = XMLdocument[i].DocumentElement.SelectNodes("//AppleSettings");
              foreach (var node in temp2)
             {
                var temp3 = node.ToString();
             }

              XmlNode xmlNode1 = XMLdocument[i].SelectSingleNode("//AppleSettings");

              XmlSerializer serial1 = new XmlSerializer(typeof(AppleSettings));

              temp = (AppleSettings)serial1.Deserialize(new XmlNodeReader(xmlNode1));
         }
     }

是否甚至需要访问AppleSettings节点?我可以直接进入两个AppleInstance子节点吗?如果有人可以帮助我,我将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

最好使用LINQ to XML API。

(1)下面的代码显示如何通过名称访问任何XML属性。

(2).FirstOrDefault()?.Value技术将防止缺少属性时生成异常。

c#

void Main()
{
    const string FILENAME = @"e:\Temp\AppleSettings.xml";

    XDocument doc = XDocument.Load(FILENAME);
    foreach (var el in doc.Descendants("AppleInstance"))
    {
        Console.WriteLine("MaxCost={0}", el.Attributes("MaxCost").FirstOrDefault()?.Value);
        Console.WriteLine("Instance={0}", el.Attributes("Instance").FirstOrDefault()?.Value);
        Console.WriteLine("GroupName={0}", el.Attributes("GroupName").FirstOrDefault()?.Value);
    }
}

答案 1 :(得分:1)

尝试以下操作:

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

namespace ConsoleApplication8
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Root));
            Root root = (Root)serializer.Deserialize(reader);

        }

    }

    public class Root
    {
        [XmlArray("status.AppleSettings")]
        [XmlArrayItem("AppleInstance")]
        public List<ApppleInstance> AppleInstances { get; set; } 
    }
    public class ApppleInstance
    {
        [XmlAttribute()]
        public int MaxCost { get; set; }
        [XmlAttribute()]
        public int Status { get; set; }
        [XmlAttribute()]
        public int NewMode { get; set; }

        [XmlAttribute()]
        public int SharePrice { get; set; }

        private Boolean _FlagTF { get; set; }
        [XmlAttribute()]
        public string FlagTF 
        { 
            get { return _FlagTF? "True" : "False";}
            set { _FlagTF = (value == "True") ? true : false;}
        }
        [XmlAttribute()]
        public int TimeClock { get; set; }
        [XmlAttribute()]
        public int TimeClockSec { get; set; }
        [XmlAttribute()]
        public long Options { get; set; }
        [XmlAttribute()]
        public string ID { get; set; }
        [XmlAttribute()]
        public string Owner { get; set; }
        [XmlAttribute()]
        public string Server { get; set; }
        [XmlAttribute()]
        public string Name { get; set; }
        [XmlAttribute()]
        public string GroupName { get; set; }
        [XmlAttribute()]
        public string Instance { get; set; }

        private Boolean _NewFlag { get; set; }
        [XmlAttribute()]
        public string NewFlag
        {
            get { return _NewFlag ? "True" : "False"; }
            set { _NewFlag = (value == "True") ? true : false; }
        }

        [XmlAttribute()]
        public int FinalCount { get; set; }

        private int[] _List { get; set; }
        [XmlAttribute()]
        public string List 
        {
            get { return string.Join(",",_List);}
            set { _List = value.Split(new char[] {','}).Select(x => int.Parse(x)).ToArray() ;}
        }
        [XmlAttribute()]
        public string Keyrepo { get; set; }
    }
}

答案 2 :(得分:0)

如果您的响应标签位于两者之间,那么LargeXMLResponse [i]的i是大XML响应的循环计数,如果您有其他选择,请继续。

var ResponseToList = LargeXMLResponse [i] .Descendants(“ Response”)。ToList();

dotnet add package Twilio
相关问题