繁体   English   中英

如何用特殊字符替换XML文档中的文本?

[英]How to replace text in XML document with special chars?

在这篇文章的末尾查看有关文本框的其他问题!

使用这种方法,我想打开一个文档,替换一些文本,然后不理会它。 它有效,那是值得骄傲的。 :d

public static void replaceInOpenXMLDocument(string pfad, string zuErsetzen, string neuerString)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(pfad, true))
            {
                var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                          where bm.InnerText != string.Empty && bm.InnerText.Contains(zuErsetzen) && bm.HasChildren == false
                          select bm;

                foreach (var item in res)
                {
                    item.InsertAfterSelf(new Text(item.InnerText.Replace(zuErsetzen, neuerString)));
                    item.Remove();
                }
                doc.Close();
            }
        }

但是它仅适用于不带特殊字符的替换。 例如:

操作系统将被Windows over 9000取代

[OS]将保持不变。

情况1:

在文件中:

您将os用于任何目的。

replaceInOpenXMLDocument("C:\NSA\suspects.docx", "os", "Win 2000");

将导致以下结果:

您将Win 2000用于任何目的。

情况2:

与特殊字符...

您可以将[os]用于任何目的。

replaceInOpenXMLDocument("C:\NSA\suspects.docx", "[os]", "Win 2000");

...它只是不理我:

您可以将[os]用于任何目的。

我尝试了几个特殊字符()[] {}等,但从未替换过。

有什么我忘了做的事吗? 还是使用这种方法无法用特殊字符替换? 如果是这样,我只需要一个简单的解决方法。

有没有人可以帮助我绝望? :)

解决方案/添加方式1:

感谢Flowerking 这是我现在正在使用的代码:

public static void replaceInOpenXMLDocument(string pfad, string zuErsetzen, string neuerString)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(pfad, true))
            {
                SimplifyMarkupSettings settings = new SimplifyMarkupSettings
                {
                    NormalizeXml = true, // Merges Run's in a paragraph with similar formatting

                };
                MarkupSimplifier.SimplifyMarkup(doc, settings);

                //zuErsetzen = new XElement("Name", zuErsetzen).Value;
                var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                          where bm.InnerText != string.Empty && bm.InnerText.Contains(zuErsetzen) && bm.HasChildren == false
                          select bm;
                // bm.InnerText.Contains(zuErsetzen)

                foreach (var item in res)
                {
                    item.InsertAfterSelf(new Text(item.InnerText.Replace(zuErsetzen, neuerString)));
                    item.Remove();
                }

                doc.Close();
            }
        }

(此代码适用于包含普通文本的普通文档!)

解决方案/添加方式2:如果要替换文本框中的文本 ,我必须做一些解决方法。 文本框被声明为图片,因此上面的代码不会触及它。

我发现了一个甚至可以通过文本框搜索的附加类( 链接 )。 ZIP下载包含一个易于理解的示例程序。

发生这种情况是因为通常在文本包含特殊字符的情况下会创建Open XML词,如下所示:

  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>[</w:t>
  </w:r>
  <w:proofErr w:type="gramStart" />
  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>text-to-replace</w:t>
  </w:r>
  <w:proofErr w:type="gramEnd" />
  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>]</w:t>
  </w:r>
</w:p>

上面显示了为文本[text-to-replace]创建的打开xml。 (请注意,并非总是如此,可能取决于您使用的客户端)。

通过代码doc.MainDocumentPart.Document.Body.Descendants()的外观,您将获取整个文档主体的所有OpenXmlPart类型Descendants,并尝试替换一个接一个地迭代的文本,从而OpenXmlPart实际文本分为一个部分,特殊字符分为两个部分。 因此,该代码无法满足要求。

可能有不同的方法来解决此问题。

解:

一个不错的(我偏爱的)解决方案是使用OpenXml Powertools的 Markup Simplifier标准化xml,这将标准化open xml标记以连接段落中的文本,从而简化程序设计工作。

示例代码:

using (WordprocessingDocument doc =
            WordprocessingDocument.Open("Test.docx", true))
 {
      SimplifyMarkupSettings settings = new SimplifyMarkupSettings
      {
             NormalizeXml = true, // Merges Run's in a paragraph with similar formatting

       };
        MarkupSimplifier.SimplifyMarkup(doc, settings);
  }

请参考我的回答这里有关使用MarkupSimplifier更多信息

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM