XML读取和获取值

时间:2017-11-29 15:29:39

标签: c# xml

如何通过提供val="icon.weapon_small_sword_i00"/>从XML文件中获取此内容:itemId。我设法做了类似的事情,但除了从文件中选择正确itemId之外,我不知道如何获得上面提到的值。 那是我的代码:

int ItemId = 15;
XmlTextReader reader = new XmlTextReader(@"D:\L2Eq\xml\items");
XmlNodeType type;
while (reader.Read())
{
    type = reader.NodeType;
    if (type == XmlNodeType.Element)
    {
        if (reader.Name == "item")
        {
            if (Int32.Parse(reader.GetAttribute(0)) == ItemId)
            {
                Console.WriteLine(reader.GetAttribute(0));
            }           
        }
    }
}

这就是XML文件的样子:

<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="items.xsd">
<item id="1" type="Weapon" name="Short Sword">
    <set name="icon" val="icon.weapon_small_sword_i00" />
    <set name="default_action" val="equip" />
    <set name="weapon_type" val="sword" />
    <set name="bodypart" val="rhand" />
    <set name="random_damage" val="10" />
    <set name="attack_range" val="40" />
    <for>
        <set order="0x08" stat="pAtk" val="8" />
        <set order="0x08" stat="mAtk" val="6" />
        <set order="0x08" stat="rCrit" val="8" />
        <set order="0x08" stat="pAtkSpd" val="379" />
    </for>
</item>
<item id="2" type="Weapon" name="Long Sword">
    <set name="icon" val="icon.weapon_long_sword_i00" />
    <set name="default_action" val="equip" />
    <set name="weapon_type" val="sword" />
    <set name="bodypart" val="rhand" />
    <set name="random_damage" val="10" />
    <set name="attack_range" val="40" />
    <for>
        <set order="0x08" stat="pAtk" val="24" />
        <set order="0x08" stat="mAtk" val="17" />
        <set order="0x08" stat="rCrit" val="8" />
        <set order="0x08" stat="pAtkSpd" val="379" />
    </for>
</item>
</list>

1 个答案:

答案 0 :(得分:3)

XmlTextReader是处理XML的一种非常笨拙的方式;我永远不会用它。旧的System.Xml.XmlDocument API是更好的选择:

var findID = "1";
string iconValue = null;

var xdoc = new System.Xml.XmlDocument();

xdoc.Load(@"D:\L2Eq\xml\items");

iconValue = xdoc.SelectSingleNode("/list/item[@id=" + findID + "]/set[@name='icon']/@val")?.Value;

或者您可以使用闪亮的新LINQ to XML类:

var doc = XDocument.Load(@"D:\L2Eq\xml\items");

iconValue = doc.Descendants("item")
    .Where(d => d.Attribute("id")?.Value == findID)
    .Descendants("set")
    .Where(x => x.Attribute("name")?.Value == "icon")
    .FirstOrDefault()?.Attribute("val")?.Value;