LINQ to XML Get(children?)元素?

时间:2013-06-06 20:04:50

标签: c# xml linq unity-container

我如何使用Linq获取ID信息。我正在尝试将它们添加到int数组中。

  <FactionAttributes>
    <name>Player</name>
    <id>0</id>
    <relationModifier>1</relationModifier>
    <relations>
        <id0>100</id0>
        <id1>50</id1>
        <id2>50</id2>
        <id3>50</id3>
        <id4>50</id4>
        <id5>50</id5>
    </relations>
  </FactionAttributes>

那是我的XML。

这是我到目前为止使用的代码。

    void InitFactions()
        {
            int count = 0;
            string filepath = Application.dataPath + "/Resources/factiondata.xml";
            XDocument factionXML = XDocument.Load(filepath);

            var factionNames = from factionName in factionXML.Root.Elements("FactionAttributes")
                select new {
                    factionName_XML = (string)factionName.Element("name"),
                    factionID_XML = (int)factionName.Element("id"),
                    factionRelations_XML = factionName.Element("relations")// Need to turn this into array.
            };

            foreach ( var factionName in factionNames)
                ++count;

            foreach ( var factionName in factionNames)
            {
                Factions f = new Factions();            
                f.otherFactionsName = new string[count];
                f.otherFactionsRelation = new int[count];
                int others = 0;

                f.FactionName = factionName.factionName_XML;

                Debug.Log(factionName.factionRelations_XML);

                // Adds Rivals, not self to other list.
                foreach (var factionName2 in factionNames)
                {
                    if (factionName.factionID_XML == factionName2.factionID_XML)
                        continue;
                    f.otherFactionsName[(int)factionName2.factionID_XML] = factionName2.factionName_XML;

// THIS IS WHERE IM ADDING THE RELATIONS IN //
                    f.otherFactionsRelation[(int)factionName2.factionID_XML] = factionName.factionRelations_XML[(int)factionName2.factionID_XML];
                    Debug.Log(f.FactionName + " adds: " + factionName2.factionName_XML);
                    ++others;
                }
            }
        }

我已经多次尝试使用节点而不是。我似乎无法弄清楚正确的语法。

2 个答案:

答案 0 :(得分:0)

XDocument doc = XDocument.Load(Path);

//To get <id>
var MyIds = doc.Element("FactionAttributes").Element("id").Value;

//To get <id0>, <id1>, etc.
var result = doc.Element("FactionAttributes")
                .Element("relations")
                .Elements()
                .Where(E => E.Name.ToString().Contains("id"))
                .Select(E => new { IdName = E.Name, Value = E.Value});

如果你想要整数数组,用这个

替换select
.Select(E => Convert.ToInt32(E.Value)).ToArray();

答案 1 :(得分:0)

如果你刚刚关系Ids使用这个简单的查询

var doc = XDocument.Load("c:\\tmp\\test.xml");
var ids = doc.Descendants("relations").Elements().Select(x => x.Value);

如果您想在一个数组中使用Id和关系ID,请使用此

var id = doc.Descendants("id").Select(x=>x.Value).Concat(doc.Descendants("relations").Elements().Select(x => x.Value));