Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搜索并替换拆分为多个的占位符<;w:t>-元素_C#_Search_Replace_Openxml - Fatal编程技术网

C# 搜索并替换拆分为多个的占位符<;w:t>-元素

C# 搜索并替换拆分为多个的占位符<;w:t>-元素,c#,search,replace,openxml,C#,Search,Replace,Openxml,我正在尝试使用OpenXMLSDK2.5从.docx模板创建报告。在模板中,我定义了一些占位符,这些占位符被实值替换。占位符可以在各种模式中定义,例如 <#Name#> or <!#Name#!> or #Name# or {{Name}} 这里的占位符#FirstName#很容易识别,因为它位于一个-元素中,但是占位符#LastName#被分割在多个-元素中,因此我无法对文档上的文本使用简单的正则表达式,如 Regex placeholderRegex = new R

我正在尝试使用OpenXMLSDK2.5从.docx模板创建报告。在模板中,我定义了一些占位符,这些占位符被实值替换。占位符可以在各种模式中定义,例如

<#Name#>
or
<!#Name#!>
or
#Name#
or
{{Name}}
这里的占位符
#FirstName#
很容易识别,因为它位于一个
-元素中,但是占位符
#LastName#
被分割在多个
-元素中,因此我无法对文档上的文本使用简单的正则表达式,如

Regex placeholderRegex = new Regex(@"#[\w]*#");

document.MainDocumentPart.Document.Body.Descendants<Text>().Where(t=> placeholderRegex.IsMatch(t.Text))
Xml(OpenXML)


{{
奥特
}}
这是一篇带有
{{
占位符
}
}
.

所以我现在的问题是,如何使用OpenXMLSDK搜索占位符并用值替换占位符?SDK中是否有一些功能可以帮助我?是否有其他人解决了此问题并提供了帮助?

是的,MS Word应用程序甚至会将单个单词拆分为多个运行/文本元素(出于某种原因)。不,在OpenXMLSDK功能中没有提供查找/替换功能。但您可以创建自己的最简单的段落/运行/文本结构。您需要:

  • 为所有单词创建一个映射,其中包含每个单词对应的Run/Text元素的信息
  • 然后,您将搜索索引中的特定单词(例如),替换第一个Run/Text元素的内容,并删除除最后一个之外的所有其他单词,最后一个可能是下一个单词的一部分。在这种情况下,您必须修复它,这样它将不再包含该单词的一部分
  • 请参阅以获取解决此问题的Java源代码的链接


    您可以在C#中实现类似的功能,或者通过

    使用该代码。我会使用类似的功能(未经测试,但我认为这将对您有所帮助):

    列表占位符=新列表()

    //加载xml字符串
    var doc=XDocument.Parse(xml);
    //或者使用XDocument.load(“path_to_xml_file.xml”)从文件加载;
    //获取所有元素
    var wpements=doc.Root.Elements(“w:p”);
    foreach(wpElements中的var wp)
    {
    var Wrements=wp.后代(“w:r”);
    foreach(以Wrements为单位的var wr)
    {
    var wt=(字符串)wr.Element(“w:t”);
    if(wt.IsMatch(@“\w”){//如果找到单词,则将字符串添加到占位符中
    占位符。添加(wt);
    }
    其他的
    {
    //如果找不到单词,请将其添加到最后一个占位符中,
    占位符[placeHolder.Count-1]=占位符[placeHolder.Count-1]+wt;
    }
    }
    }
    
    Regex placeholderRegex = new Regex(@"#[\w]*#");
    
    document.MainDocumentPart.Document.Body.Descendants<Text>().Where(t=> placeholderRegex.IsMatch(t.Text))
    
    {{Ort}}
    And this {{placeholder}} is within the text 
    
    <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
      <w:body>
        <w:p w:rsidR="007B60F2" w:rsidRDefault="00BB7370" w:rsidP="00D43D55">
          <w:pPr>
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
          </w:pPr>
          <w:r w:rsidRPr="00114EA7">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>{{</w:t>
          </w:r>
          <w:r w:rsidR="00C93A70" w:rsidRPr="00114EA7">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>Ort</w:t>
          </w:r>
          <w:r w:rsidR="00114EA7" w:rsidRPr="00114EA7">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>}}</w:t>
          </w:r>
        </w:p>
        <w:p w:rsidR="00EC3BED" w:rsidRPr="00114EA7" w:rsidRDefault="00C310E0" w:rsidP="00D43D55">
          <w:pPr>
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
          </w:pPr>
          <w:r w:rsidRPr="00114EA7">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t xml:space="preserve">This is a text with a </w:t>
          </w:r>
          <w:r w:rsidR="00A07A5D">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>{{</w:t>
          </w:r>
          <w:r w:rsidRPr="00114EA7">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>placeholder</w:t>
          </w:r>
          <w:r w:rsidR="00A07A5D">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>}</w:t>
          </w:r>
          <w:r w:rsidR="00114EA7" w:rsidRPr="00114EA7">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>}</w:t>
          </w:r>
          <w:bookmarkStart w:id="0" w:name="_GoBack" />
          <w:bookmarkEnd w:id="0" />
          <w:r w:rsidR="00A07A5D">
            <w:rPr>
              <w:lang w:val="en-US" />
            </w:rPr>
            <w:t>.</w:t>
          </w:r>
        </w:p>
        <w:sectPr w:rsidR="00EC3BED" w:rsidRPr="00114EA7" w:rsidSect="00237721">
          <w:pgSz w:w="11906" w:h="16838" />
          <w:pgMar w:top="1417" w:right="1417" w:bottom="1134" w:left="1417" w:header="708" w:footer="708" w:gutter="0" />
          <w:cols w:space="708" />
          <w:docGrid w:linePitch="360" />
        </w:sectPr>
      </w:body>
    </w:document>
    
    //load xml string
    var doc = XDocument.Parse(xml);
    //or to load from file use XDocument.Load("path_to_xml_file.xml");
    
    //get all <w:p> element
    var wpElements = doc.Root.Elements("w:p");
    
    foreach (var wp in wpElements)
    {
        var wrElements = wp.Descendants("w:r");
        foreach (var wr in wrElements)
        {
            var wt = (string)wr.Element("w:t");
            if (wt.IsMatch(@"\w")) { //add the string to placeHolders if word is found 
                placeHolders.Add(wt);
            }
            else
            {
                //if not found a word, add it to the last placeHolder, 
                placeHolder[placeHolder.Count - 1] = placeHolder[placeHolder.Count - 1] + wt;
            }
        }
    }