【问题标题】:Creating XML nodes dynamically to fetch its attribute values动态创建 XML 节点以获取其属性值
【发布时间】:2026-01-11 22:30:01
【问题描述】:

我正在使用 C# .net VS 2013 解决这个问题。

我有一个结构如下的场景,

<td>
  <text text="abc">abc
     <tspan text = "bcd">bcd
        <tspan text = "def">def
           <tspan text = "gef">gef
           </tspan>
        </tspan>
     </tspan>
  </text>
</td>

如上图,我不知道tspan节点会有多少,目前我有3个,我可能会得到4个或更多。

找到文本节点后,我将使用代码获取该节点的值,

labelNode.Attributes["text"].Value

要获取它相邻的tspan节点,我必须像使用它一样

labelNode.FirstChild.Attributes["text"].Value

要获取它相邻的tspan节点,我必须像使用它一样

labelNode.FirstChild.FirstChild.Attributes["text"].Value

像这样继续下去。

现在我的问题是,如果我知道我有 5 个标签,有没有办法将“FirstChild”动态添加到“labelNode”5 次,这样我就可以获得最后一个节点的文本值,像这样

labelNode.FirstChild.FirstChild.FirstChild.FirstChild.FirstChild.Attributes["text"].Value

如果我需要第二个值,我需要添加两次,如果我需要第三次,我需要添加三次。

请告诉我是否有任何解决方案。

如果您对我的问题感到困惑,请问我。

提前谢谢大家。

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    我认为这将是一个更简单的解决方案,而不是动态添加FirstChild

    static XmlNode GetFirstChildNested(XmlNode node, int level) {
        XmlNode ret = node;
        while (level > 0 && ret != null) {
            ret = ret.FirstChild;
            level--;
        }
        return ret;
    }
    

    那么你可以像这样使用这个函数:

    var firstChild5 = GetFirstChildNested(labelNode, 5);
    

    【讨论】:

      【解决方案2】:

      我建议使用LinqXml,它可以更简洁地解析Xml

      使用XElement(或XDocument),您可以通过调用Descendant 方法来展平层次结构并执行所有必需的查询。

      ex..
      
      XElement doc= XElement.Load(filepath);      
      var results =doc.Descendants()
                      .Select(x=>(string)x.Attribute("text"));
      
      //which returns 
      abc,
      bcd,
      def,
      gef
      

      如果你想得到最后一个孩子,你可以简单地使用。

      ex..
      
      XElement doc= XElement.Load(filepath);      
      doc.Descendants()                   
         .Last()  // get last element in hierarchy.
         .Attribute("text").Value  
      

      如果你想获得第三个元素,你可以这样做。

      XElement doc= XElement.Load(filepath);      
      doc.Descendants()                   
         .Skip(2)  // Skip first two.
         .First()   
         .Attribute("text").Value ; 
      

      查看Demo

      【讨论】: