繁体   English   中英

读取 xmlnode 子标签值

[英]Reading xmlnode child tag value

我的 xml 文件如下所示。

<mappings>
  <mapping>
    <a>a1value</a>
    <b>
      <c>
        <d>d1value</d>
        <e>e1value</e>
      </c>
    </b>
  </mapping>
  <mapping>
    <a>a2value</a>
    <b>
      <c>
        <d>d2value</d>
        <e>e2value</e>
      </c>
    </b>
  </mapping>
</mappings>

读取 a,d 标签值的 C# 代码。

XmlDocument xmlDocNew = new XmlDocument();
XmlElement CATLOG = xmlDocNew.CreateElement("mappings");
XmlNode xmlNodeTab = xmltest.DocumentElement;
XmlNodeList xmlNodeListCD = xmlNodeTab.SelectNodes("//mapping");
foreach (XmlNode xmlNodeCD in xmlNodeListCD)
{
   string innerText = xmlNodeCD["a"].InnerText;
   string xmlNodeapp = xmlNodeCD["//b/c/d"].InnerText;
}

使用上面的代码,我可以遍历所有“a”标签元素。 但我无法读取“d”标签值。 如何读取“d”标签的值?

当我遍历foreach循环中的每个元素时,我想获取“a”标签的值及其对应的“d”标签值。

此代码查看每个映射,并在其下查找标记ad的值。 另请注意,如果您想查找 'sub' 标签并仅获取这些子项,则必须使用.//而不仅仅是// 点符号将节点拉到当前节点“下方”。

    XmlDocument doc = new XmlDocument();
    doc.Load($@"{Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName}\json.txt");

    var nodes = doc.SelectNodes("//mapping");
    foreach (XmlNode node in nodes)
    {
        var aNodes = node.SelectNodes(".//a");
        foreach (XmlNode aNode in aNodes)
            Console.WriteLine(aNode.InnerText);

        // If you know there will only be one node at .//b/c/d, use SelectSingleNode instead.
        Console.WriteLine(node.SelectSingleNode(".//b/c/d").InnerText);
    }

输出

a1value
d1value
a2value
d2value

笔记:

a标签有点像d标签的兄弟,它们的单亲是mapping元素。 如果您获得所有映射节点,然后处理这些节点,您将获得最佳结果。

从 .Net 3.5 开始,Linq 和 Linq To XML 使 XML 解析更容易。 使用 Linq To XML,您可以将其读作:

    void Main()
    {
        var s = @"<mappings>
      <mapping>
        <a>a1value</a>
        <b>
          <c>
            <d>d1value</d>
            <e>e1value</e>
          </c>
        </b>
      </mapping>
      <mapping>
        <a>a2value</a>
        <b>
          <c>
            <d>d2value</d>
            <e>e2value</e>
          </c>
        </b>
      </mapping>
    </mappings>";
        var data = from x in XDocument.Parse(s).Descendants("mapping")
                   select new {
                    a=(string)x.Element("a"),
                    d=(string)x.Element("b").Element("c").Element("d")
                    };

        foreach (var e in data)
        {
            Console.WriteLine($"{e.a}, {e.d}");
        }
    }

对于文件,而不是.Parse ,您将使用.Load( filename )

输出

a1value, d1value
a2value, d2value

如果您有一个与此结构匹配的类,例如:

public class MyData
{ 
    public string A { get; set; }
    public string D { get; set; }
}

然后你可以像这样使用这个类而不是匿名类型:

var data = from x in XDocument.Parse(s).Descendants("mapping")
           select new MyData {
            A=(string)x.Element("a"),
            D=(string)x.Element("b").Element("c").Element("d")
            };

foreach (var e in data)
{
    Console.WriteLine($"{e.A}, {e.D}");
}

PS:由于您获得了 IEnumerable,您可以直接将数据绑定到DataGridView, ListBox ... ( ...DataSource = data.ToList())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM