【问题标题】:How to get the specific innertext of my xmlnode in C#?如何在 C# 中获取我的 xmlnode 的特定内部文本?
【发布时间】:2012-09-18 21:15:53
【问题描述】:

我有一个用于处理的 XML 节点。以下是我的 xml 节点。

<w:p>
 <w:r>
   <w:t>
     Text1
   </w:t>
  </w:r>
  <w:r>
    <w:pict>
       <w:p>
         <w:r>
           <w:t>
             text2
            </w:t>
          </w:r>
        </w:p>
      </w:pict>
   </w:r>
 <w:r>
   <w:t>
     Text3
   </w:t>
  </w:r>
  <w:r>
</w:p>

现在我只想从&lt;w:p&gt;&lt;w:r&gt;&lt;w:t&gt; 获取内部文本,而不是从&lt;w:p&gt;&lt;w:r&gt;&lt;w:pict&gt;&lt;w:p&gt;&lt;w:r&gt;&lt;w:t&gt;

所以,我需要的输出是Text1Text3

我的 C# 代码是:

 XmlNodeList pNode = xDoc.GetElementsByTagName("w:p");
 for (int i = 0; i < pNode.Count; i++)
 {
    if(i==0)  //This is my criteria 
    {
      XmlNode firstNode = pNode[i];
      string innerText=firstNode.innerText.toString().Trim();
    }
 }

但它会返回所有内部文本,例如Text1Text2Text3

请指导我摆脱这个问题?

【问题讨论】:

  • 使用 Linq TO XML 或 XPath 表达式。

标签: c# linq c#-4.0 xml-parsing linq-to-xml


【解决方案1】:

我建议您使用XDocument(如果您有 .NET 3.5 或更高版本)。此代码获取具有模式 p/r/t 但不具有 pict/p/r/t 的所有元素的值:

        // Use this if you're loading XML from a string
        XDocument doc = XDocument.Parse(inputString);
        // Use this if you're loading XML from a file
        //XDocument doc = XDocument.Load(<filepath>);

        var pElements = doc.Root
            .Descendants()
            .Where(el => el.Name.LocalName == "p" && el.Parent.Name.LocalName != "pict");

        List<string> innerTexts = new List<string>();
        foreach(XElement p in pElements)
        {
            var rElements =  p.Elements().Where(el => el.Name.LocalName == "r");
            foreach(XElement r in rElements)
            {
                var tElements = r.Elements().Where(el => el.Name.LocalName == "t");
                innerTexts.AddRange(tElements.Select(el => el.Value).ToArray());
            }
        }

我使用了LocalName,因为没有提供关于w 命名空间的信息。

【讨论】:

    【解决方案2】:

    您需要检查每个元素 p,确保其所有锚点都不是 pict 元素。

    var result = XElement.Load(@"path-to-your-xml")
                         .Descendants("t")
                         .Where(e => !e.AnchestorsAndSelf().Any(a => a.Name.LocalName == "pict"));
    

    【讨论】:

      【解决方案3】:

      您可以使用 XPath:(我认为以下内容应该适合您)

      w:p/w:r/w:t
      

      【讨论】:

        猜你喜欢
        • 2021-07-30
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多