4

C#を使用して属性「アクション」と「ファイル名」の値を正しい方法で取得するには?

XML:

<?xml version="1.0" encoding="utf-8" ?>
 <Config version="1.0.1.1" >
   <Items>
    <Item action="Create" filename="newtest.xml"/>
    <Item action="Update" filename="oldtest.xml"/>   
  </Items>
 </Config>

C#: foreach ループで値を取得する方法と同様に、属性値を取得できませんか? これを解決するには?

        var doc = new XmlDocument();
        doc.Load(@newFile);
        var element = ((XmlElement)doc.GetElementsByTagName("Config/Items/Item")[0]); //null
        var xmlActions = element.GetAttribute("action"); //cannot get values
        var xmlFileNames= element.GetAttribute("filename"); //cannot get values

         foreach (var action in xmlActions)
         {
           //not working
         }

         foreach (var file in xmlFileNames)
         {
           //not working
         }

あなたのコード例は私にとって大きな意味があります。ありがとう!

4

4 に答える 4

9

LINQ to XMLを使用できます。Action次のクエリは、とFileNameプロパティを持つアイテムの厳密に型指定されたコレクションを返します。

var xdoc = XDocument.Load(@newFile);

var items = from i in xdoc.Descendants("Item")
            select new {
               Action = (string)i.Attribute("action"),
               FileName = (string)i.Attribute("fileName")
            };

foreach (var item in items)
{
   // use item.Action or item.FileName
}
于 2013-08-02T13:35:39.913 に答える
3

GetElementsByTagName直系の子孫のみを検索します。引数は、要素のパス全体ではなく、単なるタグ名であると想定されています。

XPath 式を指定しながらドキュメント全体を検索する場合は、SelectNodes代わりに を使用します。

ドキュメントの場合、次のようになります。

var element = (XmlElement)doc.SelectNodes("/Config/Items/Item")[0];
于 2013-08-02T13:13:06.600 に答える
2

質問のコードには多くの問題があります:
1. GetElementsByTagName で XPath を使用しています。タグを使用する
だけです 2. [0] を使用して XmlNodeCollection の最初の XmlNode のみを取得してい
ます 3. XmlNodeが1つある場合、属性を取得するための文字列の結果のみが取得され、文字列のコレクションではなく、4から列挙しようとしています
。foreachが壊れています。結果のオブジェクトの型はありません

動作するスニペットを次に示します。

var doc = new XmlDocument();
doc.Load("test.xml");
var items = doc.GetElementsByTagName("Item");

var xmlActions = new string[items.Count];
var xmlFileNames = new string[items.Count];
for (int i = 0; i < items.Count; i++) {
    var xmlAttributeCollection = items[i].Attributes;
    if (xmlAttributeCollection != null) {
        var action = xmlAttributeCollection["action"];
        xmlActions[i] = action.Value;

        var fileName = xmlAttributeCollection["filename"];
        xmlFileNames[i] = fileName.Value;
    }
}

foreach (var action in xmlActions) {
    //working
}

foreach (var file in xmlFileNames) {
    //working
}

または、アクションを実行する前にコレクション内のすべてのアクションとファイル名を必要としない場合は、for ループで各アクション/ファイル名を実行することができます。

于 2013-08-02T13:44:42.650 に答える