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>

我必须读取每个节点的值,即 Node1、Node2、Node3、Node4,它们位于 Segment 节点下,其属性 ie Name = "AAA"。我怎样才能做到这一点。我指的是stackoverflow的以下链接,但这对我不起作用。

如何在 C# 中从 XmlNode 读取属性值?

我需要这样的输出

让我有四个 sting 变量strNode1, strNode2, strNode3, strNode4。我想将值存储在上述四个变量中,如下所示

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

假设您有一个XmlDocument您可以使用 XPath,例如:

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

获取Segment节点,然后在循环中迭代其所有子节点。

于 2013-04-22T12:35:05.213 回答
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 回答
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 回答
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 回答
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

如果您曾经使用过 linq-to-entities 或 linq-to-sql,那么您可以使用linq-to-xml 。

于 2013-04-22T12:33:03.637 回答