0

ノードのプロパティを取得するにはどうすればいいですか?だから、Linq To Xml を使用してファイルを解析します。私はそのようにしようとします:

// load doc and then give elements.
XDocument doc = XDocument.Load(pathToFile);
var elem = doc.Root
              .Elements("mode")
              .Where(o => o.Attribute("name") != null)
              .Elements("file")
              .Where(k => k.Attribute("name") !=null && k.Attribute("name").Value == filenameTag)
              .Elements("model")
              .Where(o => o.Attribute("name") != null)
              .Elements("class")
              .Where(c => c.Attribute("name") != null);


foreach (var el in elem)
{
    Console.WriteLine("First Attribute "+el.FirstAttribute.ToString());
    Console.WriteLine("Name "+el.Name);
    Console.WriteLine("Last Attribute " + el.LastAttribute.ToString());

    var nodes=el.Nodes();
    foreach (var node in nodes)
    {
        Console.WriteLine("node "+node.ToString());
    }

}

XML ファイル:

  <modes>
    <mode name="mode1">
      <file name="file1.xml">
        <model name="Config" AllClasses="false">
          <ignore.class class="class5"/>
          <class name="class1" allProprs="true"/>
          <class name="class2" allProps="false">
              <property name="pr1"/>
              <ignore.property property="pr2"/>
           </class>
         </model>
       </file> 
    </mode>
</modes>

したがって、次のような文字列のみを取得します。

node <property name="pr1" />
node <ignore.property property="pr2" />

しかし、値「pr1」と「pr2」を取得する方法は?

ありがとう!

4

3 に答える 3

2

表示時:

node <property name="pr1" />
node <ignore.property property="pr2" />

繰り返しています<class>。子要素の属性を取得する場合は、子要素の属性を要求します

foreach (var attrib in el.Elements().Attributes())
{
    Console.WriteLine("node " + (string)attrib);
}

どの出力:pr1およびpr2、要求に応じて

于 2013-09-23T07:09:10.563 に答える
1

Your problem is that you simply writing ToString representation of inner elements of class. That gives you whole content of properties elements. But you should get value of first attribute from each property element:

var xdoc = XDocument.Load(path_to_xml);
string filenameTag = "file1.xml";
var classes = xdoc.Descendants("file")
                  .Where(f => (string)f.Attribute("name") == filenameTag)
                  .Elements("model")
                  .Where(m => (string)m.Attribute("name") != null)
                  .Elements("class")
                  .Where(c => (string)c.Attribute("name") != null);

foreach (var c in classes)
{
    Console.WriteLine("Name: " + (string)c.Attribute("name"));
    foreach(var p in c.Elements())
       Console.WriteLine("Property: " + (string)p.Attributes().FirstOrDefault());
}

Outputs:

Name: class1
Name: class2
Property: pr1
Property: pr2

BTW it's much easier to write this query with XPath:

string xpath = String.Format("//file[@name='{0}']/model[@name]/class[@name]", filenameTag);
var classes = xdoc.XPathSelectElements(xpath);
于 2013-09-23T07:07:03.343 に答える