【发布时间】:2012-01-24 14:29:09
【问题描述】:
如何注释掉包含 cmets 的 XML 部分?
以下将不起作用。它只会输出stuff0:
<!--
stuff0
<!-- stuff1 -->
stuff2
<!-- stuff3 -->
stuff4
<!-- stuff5 -->
stuff6
-->
【问题讨论】:
-
nested comments in XML? 的可能重复项
如何注释掉包含 cmets 的 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开始大评论,并以?>结束。
几乎任何单词都可以作为处理指令,因为它们大部分时间都没有真正使用。我的意思是,你最后一次使用它是什么时候?
【讨论】:
-- 不允许在 XML cmets 中使用。您可以在两个- 之间添加一个空格。如果您想以编程方式执行此操作,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 根据其specification 不支持嵌套 cmets。
【讨论】:
你有两个选择:
-- 实例替换为其他内容。【讨论】:
这是另一种方法:您可以只使用嵌套的 cmets,就好像它在 XML 中受支持一样:
<!-- Outer comment
<SomeXML> ... </SomeXML>
<!-- Inner comment
<SomeXML> ... </SomeXML>
-->
-->
然后只在文本编辑器中使用 this XML。您实际输入到流程中的 XML 是您编写的某个简单程序的输出,该程序读取嵌套注释 XML 并吐出未嵌套注释 XML。
另一个类似的技巧是使用 C 编译器的预处理器。几年前我用微软的 C++ 编译器做过这个。编译器 cl.exe 实际上调用了两个单独的程序 cl1.exe 和 cl2.exe。 Cl1.exe 是预处理器。因此,您可以将任何内容(XML、nmake 脚本等)输入其中,然后它会对其进行预处理。所以这样的事情会起作用:
<SomeXML> ... </SomeXML>
#ifdef PRODUCE_THIS
<SomeMoreXML> ... </SomeMoreXML>
#endif
【讨论】: