如何注释掉带有注释的XML部分?
以下方法不起作用。它仅注释掉stuff0
:
<!--
stuff0
<!-- stuff1 -->
stuff2
<!-- stuff3 -->
stuff4
<!-- stuff5 -->
stuff6
-->
我知道你不应该这么做,按照XML规范来说是不允许的。
话虽如此……我真的非常需要这样做,所以这里有个技巧。用一个未使用的处理指令将你想要注释的部分包围起来:
<some-tags />
<?comment
<!-- traditional comment 1 -->
<badtag prop1="123">
<!-- traditional comment 2 -->
</badtag>
<!-- traditional comment 3 -->
?>
<rest-of-my-tags />
你可以使用任何未被使用的处理指令。我选择了“comment”作为未使用的处理指令,因此我用<?comment
开始了大注释,并以?>
结尾。
实际上,几乎任何单词都可以用作处理指令,因为它们大部分时间并没有被使用。我的意思是,你上一次使用处理指令是什么时候?
--
在XML注释中是不允许的。你可以在两个-
之间添加一个空格。如果你想以编程方式实现这一点,可以使用XSLT。例如,下面的XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<a>
<xsl:comment select="'a -- b -- c'"/>
</a>
</xsl:template>
</xsl:stylesheet>
<a><!--a - - b - - c--></a>
但是XSLT处理器可能会输出错误。根据规范,这取决于实现是否添加空格或引发错误。
你有两个选择:
--
替换为其他内容。这里有另一种方法:你可以像在XML中支持的那样,使用嵌套注释:
<!-- Outer comment
<SomeXML> ... </SomeXML>
<!-- Inner comment
<SomeXML> ... </SomeXML>
-->
-->
然后只需在文本编辑器中使用此 XML。实际上,您要输入到进程中的XML是您编写的一些简单程序的输出,该程序读取嵌套注释XML并输出未嵌套注释XML。
另一个类似的技巧是使用C编译器的预处理器。我多年前就用过微软的C++编译器。编译器cl.exe实际上调用了两个单独的程序cl1.exe和cl2.exe。Cl1.exe是预处理器。因此,您可以将任何东西输入到其中(XML、nmake脚本等),它都会进行预处理。因此,像这样的东西将起作用:
<SomeXML> ... </SomeXML>
#ifdef PRODUCE_THIS
<SomeMoreXML> ... </SomeMoreXML>
#endif