5

次の XML があります。

<Loop Name="MasterData">
  <Loop Name="SlaveData">
    <Segment Name="AAA">
      <Node1>hello</Node1>
      <Node2>john</Node2>
      <Node3>hi</Node3>
      <Node4>marry</Node4>
    </Segment>
    <Segment Name="BBB">
      <Node1>00</Node1>
      <Node2> </Node2>
      <Node3>00</Node3>
      <Node4> </Node4>
    </Segment> 
   </Loop>
</Loop>

各ノードの値、つまりノード 1、ノード 2、ノード 3、ノード 4 を読み取る必要がありますName = "AAA"。これどうやってするの。私はstackoverflowから次のリンクを参照していますが、それは私にとってはうまくいきません。

C#でXmlNodeから属性値を読み取る方法は?

このような出力が必要です

4 つの文字列変数を用意しますstrNode1, strNode2, strNode3, strNode4。次のように、上記の 4 つの変数に値を格納したい

strNode1 = "hello"
strNode2 = "john"
strNode3 = "hi"
strNode4  = "marry"
4

9 に答える 9

8

XmlDocumentを使用して xml をオブジェクトとしてロードし、XPathを使用して必要な特定のノードをクエリできます。あなたの xpath クエリ (今はテストできません) は、おそらく次のようになります。

XmlNodeList xNodes = xmlDocument.SelectNodes("//Segment[@Name = 'AAA']");
于 2013-04-22T12:35:59.773 に答える
6

問題の簡単な解決策を見つけました

XmlNodeList xnList = doc.SelectNodes("/Loop/Loop/Segment[@Name='AAA']");
          foreach (XmlNode xn in xnList)
          {
              if (xn.HasChildNodes)
              {
                  foreach (XmlNode item in xn.ChildNodes)
                  {
                      Console.WriteLine(item.InnerText);
                  }
              }  
          }
于 2013-04-23T04:59:40.493 に答える
4

XDocument を使用することをお勧めします (親ノードなどに基づく NB 固有のフィルタリングは省略されています)。

var document = XDocument.Load(path);
var nodes = document.Descendents().Where(e => e.Name.LocalName.StartsWith("Node"));

親要素のフィルタリングを含めるように更新

var nodes = document.Descendents()
                    .Where(e => e.Atrributes().Any(a => a.Name.localName == "Name" && a.Value == "AAA"))
                    .SelectMany(e => e.Descendents().Where(e => e.Name.LocalName.StartsWith("Node"));
var values = nodes.Select(n => n.Value).ToList(); // This will be a list containing "hello", "john, "hi", "marry"
于 2013-04-22T12:30:53.283 に答える
3

XmlDocumentXPath を次のように使用できるとします。

XmlNode node = doc.SelectSingleNode("//Segment[@Name='AAA']");

ノードを取得し、Segmentそのすべての子をループで繰り返します。

于 2013-04-22T12:35:05.213 に答える
2

XmlDocument と XPath を使用できます。

XmlDocument doc = new XmlDocument();
doc.Load(xml);
foreach(XmlNode node in doc.SelectNodes("//Segment[@Name='AAA']/node()"))
{
    string name = node.Name;
    string value = node.innerText;
    // ...
}
于 2013-04-22T12:36:22.163 に答える
2

これを試して:

System.Xml.Linq.XDocument doc = XDocument.Load(your file);

var nodes = 
     doc.Element("Loop").Element("Loop").Elements("Segment")
                .Where(input => (string)input.Attribute("Name") == "AAA")
                .Select(input => input.Elements()).ToList();

それで:

List<string> result = new List<string>();

foreach (List<XElement> item in nodes)
{
    result.AddRange(item.Select(i => i.Value));
}
于 2013-04-22T12:35:39.557 に答える
0

これを試してみてください..

List<string> nodeDetails = new List<string>();

       var nodes = from n in XDocument.Load(@"D:\pfXml.xml")
                                              .Element("Loop")
                                              .Element("loop")
                                              .Elements("Segment")
                                      where (string)n.Attribute("Name") == "AAAA"
                                      select new
                                      {
                                          n1 = n.Element("Node1").Value,
                                          n2 = n.Element("Node2").Value,
                                          n3 = n.Element("Node3").Value,
                                          n4 = n.Element("Node4").Value
                                      };
        foreach (var node in nodes)
        {
            nodeDetails.Add(node.n1);
            nodeDetails.Add(node.n2);
            nodeDetails.Add(node.n3);
            nodeDetails.Add(node.n4);
        }
于 2014-12-04T11:04:59.577 に答える
0

これを試すことができますか?

XDocument xmlFile = XDocument.Load("myFile.xml");
foreach (var nodeSegment in xmlFile.Descendants("Loop"))
{
   foreach (var nodes in nodeSegment.Descendants().Where(e => e.Name.LocalName.StartsWith("Node")))
   {

   }
}
于 2013-04-22T12:36:00.417 に答える