【问题标题】:Reading xmlnode child tag value读取 xmlnode 子标签值
【发布时间】:2020-01-03 07:20:39
【问题描述】:

我的 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>

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

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”标签值。

【问题讨论】:

    标签: c# xmlnode


    【解决方案1】:

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

        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 元素。如果你得到所有的映射节点然后处理这些节点,你会得到最好的结果。

    【讨论】:

    • 在每次迭代中我想读取“a”标签值及其对应的“d”值。使用上面的代码,我只能得到“d”标签的值。
    【解决方案2】:

    从 .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}");
            }
        }
    

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

    输出

    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())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多