【问题标题】:how to remove specific xml elements from the xml content using C#4.0?如何使用 C#4.0 从 xml 内容中删除特定的 xml 元素?
【发布时间】:2012-09-06 03:42:19
【问题描述】:

这是 xml 内容。

<w:tbl xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tr>
      <w:tc>
         <w:p>
           <w:r><w:t>1</w:t></w:r>
         </w:p>
         <w:p /> <!-- needs to remove -->
         <w:p /> <!-- needs to remove -->
       </w:tc>
       <w:tc>
         <w:p>
           <w:r><w:t>2</w:t></w:r>
         </w:p>
         <w:p />  <!-- needs to remove -->
         <w:p />  <!-- needs to remove -->
       </w:tc>
  </w:tr>
  <w:tr>
      <w:tc>
         <w:p>
           <w:r><w:t>3</w:t></w:r>
         </w:p>
         <w:p />  <!-- needs to remove -->
         <w:p />  <!-- needs to remove -->
       </w:tc>
       <w:tc>
         <w:p>
           <w:r><w:t>4</w:t></w:r>
         </w:p>
         <w:p />  <!-- needs to remove -->
         <w:p />  <!-- needs to remove -->
       </w:tc>
  </w:tr>
</w:tbl>

实际上这个xml内容是由html到ooxml转换器[HtmlToOpenXml.dll]生成的。但是它错误地在每个&lt;w:tc&gt;元素的末尾添加了两个&lt;w:p&gt;元素。所以,我想删除那些&lt;w:p&gt;转换器生成的 xml 内容中的元素。我有字符串格式的 xml 内容。

请指导我摆脱这个问题...

【问题讨论】:

    标签: c# .net xml-parsing linq-to-xml


    【解决方案1】:

    你可以只使用字符串替换吗?

    xmlString.Replace("<w:p />", "");
    

    【讨论】:

      【解决方案2】:

      如果一切都那么简单,我强烈建议使用@sylon 的答案。 无论如何,这是一个如何使用 LINQ to XML 执行此操作的简单示例:

              XElement x = XElement.Load("In.xml");
              string prefix = "w";
              XNamespace w = x.GetNamespaceOfPrefix(prefix);
              var ds = x.Descendants(w + "p")
                        .Where(d => string.IsNullOrEmpty(d.Value));
              ds.Remove();
              x.Save("Out.xml");
      

      如果您需要删除一些更具体的标签,Where 子句可以包含更具体的条件。

      【讨论】:

        【解决方案3】:
        string xmlString = @"<w:tbl xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
              <w:tr>
                  <w:tc>
                     <w:p>
                       <w:r><w:t>1</w:t></w:r>
                     </w:p>
                     <w:p /> <!-- needs to remove -->
                     <w:p /> <!-- needs to remove -->
                   </w:tc>
                   <w:tc>
                     <w:p>
                       <w:r><w:t>2</w:t></w:r>
                     </w:p>
                     <w:p />  <!-- needs to remove -->
                     <w:p />  <!-- needs to remove -->
                   </w:tc>
              </w:tr>
              <w:tr>
                  <w:tc>
                     <w:p>
                       <w:r><w:t>3</w:t></w:r>
                     </w:p>
                     <w:p />  <!-- needs to remove -->
                     <w:p />  <!-- needs to remove -->
                   </w:tc>
                   <w:tc>
                     <w:p>
                       <w:r><w:t>4</w:t></w:r>
                     </w:p>
                     <w:p />  <!-- needs to remove -->
                     <w:p />  <!-- needs to remove -->
                   </w:tc>
              </w:tr>
            </w:tbl>";
        
        XDocument doc = XDocument.Parse(xmlString);
        doc.Root.Descendants().Where(d => d.IsEmpty && !d.HasAttributes).Remove();
        

        【讨论】:

        • 但它比将&lt;w:p /&gt; 替换为string.Empty 要慢得多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多