Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
.net 使用正则表达式用XML标记包装部分文本_.net_Xml_Regex_Tags - Fatal编程技术网

.net 使用正则表达式用XML标记包装部分文本

.net 使用正则表达式用XML标记包装部分文本,.net,xml,regex,tags,.net,Xml,Regex,Tags,我们正在开发内部工具,为.NET产品生成文档 作为其功能的一部分,我们需要用标记包装普通段落 在此上下文中,“普通段落”意味着它是一行文本,可能带有一些类似内联XML的标记,但不在其他块标记(如或)内 源文件的一个示例: Description paragraph #1. Description paragraph #2. <code> Method1(); Method2(); </code> <list type="number"> <item&

我们正在开发内部工具,为.NET产品生成文档

作为其功能的一部分,我们需要用
标记包装普通段落

在此上下文中,“普通段落”意味着它是一行文本,可能带有一些类似内联XML的标记,但不在其他块标记(如
)内

源文件的一个示例:

Description paragraph #1.
Description paragraph #2.
<code>
Method1();
Method2();
</code>
<list type="number">
  <item>
    <description>
      If you need to do something, use the <see cref="P:foo1" /> method.
    </description>
  </item>
  <item>
    <description> The <see cref="P:foo2" /> method does this.
The <see cref="P:foo3" /> method does that.</description>
  </item>
</list>

<section>
<title>Section title</title>
<content>
Section paragraph #1.
Section paragraph #2.
</content>
</section>
应将其转换为以下内容:

<para>Description paragraph #1.</para>
<para>Description paragraph #2.</para>
<code>
Method1();
Method2();
</code>
<list type="number">
  <item>
    <description>
      If you need to do something, use the <see cref="P:foo1" /> method.
    </description>
  </item>
  <item>
    <description> The <see cref="P:foo2" /> method does this.
The <see cref="P:foo3" /> method does that.</description>
  </item>
</list>

<section>
<title>Section title</title>
<content>
<para>Section paragraph #1.</para>
<para>Section paragraph #2.</para>
</content>
</section>
从形式上讲,任务听起来是这样的:用..将每一行文本包装起来。。但这不仅仅是因为它不在其他标记的有限列表中。标签中的每个未来段落周围都允许使用空白,如CR/LF、制表符、空格字符等

显然,应该使用正则表达式来实现这一点,但我们还没有成功构建出适用于这种情况的东西。有什么想法或建议吗?

你说“显然应该使用正则表达式”。很多人会说你在这个断言中遗漏了一个“不是”。看

如果您确信外部级别标记没有嵌套,则可以在一些可怕的正则表达式上拆分,如:

(<list([^<]|<(?!/list))+</list>)|(<code([^<]|<(?!/code))+</code>)|([^\n]+)

(很难从您的示例中推断出完整的需求,但是如果您的示例是典型的,那么在将提供的内容包装到
元素中以使其格式良好之后,以下XSLT 2.0样式表就可以完成这项工作:

<xsl:template match="/wrapper/*">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="/wrapper/text()">
  <xsl:for-each select="tokenize(., '\n')">
    <para><xsl:copy-of select="."/></para>
  </xsl:for-each>
</xsl:template>


为什么不
Method1();
Method2();
para
中。因为
标记的内容被转换为结果HTML标记,应该按原样放置。外部标记的有限列表中有任何一个可以嵌套吗?如果是这样的话,你就不走运了。@NicholasW,在一般情况下-是的。但是如果没有解决方案,我们可以限制它。如果我们使用这个限制,有什么代码可以看吗?不要单独使用正则表达式:解析XML,然后使用XPath(或LINQ to XML)要查找不是您的子元素的文本节点,请设置“不更改”元素。然后处理该文本:如果它实际上只是每个单独的行(即换行符分隔),则使用
字符串。拆分
并创建
元素即可。