7

XMLドキュメントがあり、という要素の子ノードを取得しようとしています。Unit

私のXMLドキュメントは次のようにレイアウトされています。

<Unit>
    <id>3</id>
    <name>System Information</name>
    <description>null</description>
    ... other ...
</Unit>

これは私がそれらを読んでみるために使用しているコードです。

public void Load()
{
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    XmlDocument xmldoc = new XmlDocument();
    XmlNodeList xmlnode;

    xmldoc.Load(fs);
    xmlnode = xmldoc.GetElementsByTagName("Units");

    for (int i = 0; i < xmlnode.Count; i++)
    {
        string str = string.Format("ID: {0}\r\nName:{0}", xmlnode[i].ChildNodes.Item(0).InnerText, xmlnode[i].ChildNodes.Item(1).InnerText);
        MessageBox.Show(str);
    }
}

しかし、問題は、アイテム0またはアイテム1を取得する代わりに、それらを取得しようとすると、選択したアイテムではなく、すべてのアイテムが表示されることです。

4

3 に答える 3

11

あなたのxmlとコードからわかるように。行にエラーがあります:

 xmlnode = xmldoc.GetElementsByTagName("Units");

オンに変更します:

 xmlnode = xmldoc.GetElementsByTagName("Unit");
于 2013-02-17T10:27:06.660 に答える
9

Linq to Xml を使用すると、xml を (匿名の) 厳密に型指定されたオブジェクトに簡単に解析できます。

public void Load()
{
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);

    var xdoc = XDocument.Load(fs);
    var units = from u in xdoc.Descendants("Unit")
                select new {
                   Id = (int)u.Element("id"),
                   Name = (string)u.Element("name")
                };

    foreach(var unit in units)
    {
       // thanks God for IntelliSense!
       MessageBox.Show(String.Format("ID:{0}\r\nName:{1}", unit.Id, unit.Name));
    }
}

実際、これらの値をメッセージ ボックスに表示するだけであれば、すべてのコードを 1 行で記述できます。しかし、データの取得と表示が分離されている場合(理想的には別の方法で)、最初のアプローチを好みます。

XDocument.Load(filePath)
         .Descendants("Unit")
         .Select(u => String.Format("Id:{0}\nName:{1}", (int)u.Element("id"), (string)u.Element("name"))
         .ToList()
         .ForEach(MessageBox.Show);
于 2013-02-17T10:38:38.317 に答える
5

要素名にタイプミスがあります:Unitの代わりに を使用する必要がありUnitsます。

ただし、代わりに LINQ to XML を使用してみましたXmlDocumentか?

public void Load()
{
    var doc = XDocument.Load(filePath);

    foreach(var unit in doc.Descendants("Unit"))
    {
        string str = string.Format("ID: {0}\r\nName:{0}", unit.Element("id").Value, unit.Element("name").Value);
        MessageBox.Show(str);
    }
}
于 2013-02-17T10:28:34.467 に答える