【问题标题】:How find and remove a piece of code from a XML file如何从 XML 文件中查找和删除一段代码
【发布时间】:2021-12-29 10:38:49
【问题描述】:

xml:

<?xml version="1.0" encoding="UTF-8"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" (...) >
   <w:body>
      <w:tbl>
         (...)
      </w:tbl>
      <w:sdt>
         (...)
      </w:sdt>

      vvvvvvvv
      <w:p w14:paraId="7A11D" w14:textId="7777777" w:rsidR="003B12D0" w:rsidRDefault="003B12D0" w:rsidP="003B12D0">
         <w:pPr>
            <w:rPr>
               <w:sz w:val="18" />
            </w:rPr>
         </w:pPr>
         <w:r>
            <w:rPr>
               <w:sz w:val="18" />
            </w:rPr>
            <w:br w:type="page" />
         </w:r>
         <w:r>
            <w:t />
         </w:r>
      </w:p>
      ^^^^^^

      <w:sectPr w:rsidR="0094346E" w:rsidRPr="000947D4" w:rsidSect="009B7919">
         (...)
      </w:sectPr>
   </w:body>
</w:document>

c#:

XDocument doc = outputDocument.Document;
XNamespace nameSpace = XNamespace.Get("http://schemas.openxmlformats.org/wordprocessingml/2006/main");

var result = doc.Descendants().Select(x => x.Element(nameSpace + "p")); 

此代码返回包含

标记的所有元素。 如果我能找到一个有标签的元素会很酷:

<w:r>
  <w:t />
</w:r>

并删除具有最近父级的整个对象。 上面的代码在 vvv 和 ^^^

之间

【问题讨论】:

  • 如何使用 XSLT 完成任务?

标签: c# xml linq-to-xml


【解决方案1】:
    XDocument doc = XDocument.Load(filename);
    XNamespace nameSpace = XNamespace.Get("http://schemas.openxmlformats.org/wordprocessingml/2006/main");

    var nodesWithTagP = doc.Descendants().Select(x => x.Element(nameSpace + "p")).Where(x => x!=null);
    foreach(var nodeWithTagP in nodesWithTagP)
    {
        var nodesWithTagR = nodeWithTagP.Descendants(nameSpace + "r");
        foreach (var nodeWithTagR in nodesWithTagR)
        {
            var nodesWithTagT = nodeWithTagR.Descendants(nameSpace + "t");
            foreach (var nodeWithTagT in nodesWithTagT)
            {
                 if(nodeWithTagT.Descendants().Count() = 0)
                 {
                     //Here you can use nodeWithTagP
                     nodeWithTagP.Remove();
                 }
            }
        }
    }

    doc.Save(filename);

【讨论】:

  • 是的,看起来不错,但是我只需要删除那些标签为的。我的文档中很多地方都有一个,但我只想删除它为空的那个(
  • 也许你需要在删除前再添加一个测试,测试是否没有带有标签 T 的节点的后代:
  • 我已经更新了答案
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 2013-09-11
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多