我正在使用XML来共享HTML内容。 AFAIK,我可以通过以下方式嵌入HTML:
编码:我不知道它是否完全安全。我不得不再次解码它。
使用CDATA部分:如果内容包含结束标记“]]>”我仍然会遇到问题“我相信,还有某些十六进制字符。另一方面,XML解析器将为我透明地提取信息。
我应该选择哪个选项?
更新:xml将在java中创建,并作为字符串传递给.net Web服务,它将被解析回来。因此,我需要能够将xml导出为字符串并使用“doc.LoadXml(xmlString);”
加载它答案 0 :(得分:30)
这两个选项几乎完全相同。以下是您的两个选择:
<html>This is <b>bold</b></html>
<html><![CDATA[This is <b>bold</b>]]></html>
在这两种情况下,您都必须检查字符串是否要转义特殊字符。很多人假装CDATA字符串不需要任何转义,但正如你所指出的,你必须确保“]]&gt;”没有滑倒。
在这两种情况下,XML处理器都会将您的字符串返回给您解码。
答案 1 :(得分:12)
CDATA更容易通过眼睛阅读,而编码内容可以安全地结束CDATA标记 - 但您不必关心。只需使用XML库并不再担心它。然后你要说的是“将这个文本放在这个元素中”,库将对其进行编码或将其包装在CDATA标记中。
答案 2 :(得分:7)
CDATA为简单起见。
答案 3 :(得分:3)
如果使用CDATA,则必须正确解码(textContent,value和innerHTML是不会返回正确数据的方法)。
让我们假设您使用类似于此的xml结构:
<response>
<command method="setcontent">
<fieldname>flagOK</fieldname>
<content>479</content>
</command>
<command method="setcontent">
<fieldname>htmlOutput</fieldname>
<content>
<![CDATA[
<tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:55</td><td align='right'>113</td><td align='right'>NE</td><td align='right'>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&iwloc=A&t=h&z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:56</td><td align='right'>112</td><td align='right'>NE</td><td align='right'>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&iwloc=A&t=h&z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 18:00</td><td align='right'>111</td><td align='right'>SE</td><td align='right'>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&iwloc=A&t=h&z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
]]>
</content>
</command>
</response>
在javascript中,然后您将通过将xml(例如jquery)加载到下面的xmlDoc之类的变量中进行解码,然后获取item(1)
标记的第二次出现(content
)的nodeValue
xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue
或(两种符号都相同)
xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
答案 4 :(得分:1)
我不知道你正在使用什么XML构建器,但PHP(实际上是libxml)知道如何在CDATA部分中处理]]>
,所以每个其他XML框架都应该如此。所以,我会使用CDATA部分。
答案 5 :(得分:1)
将CD包装在CDATA中是有意义的。 HTML文本可能构成XML中的单个值。
因此,不将其包装在CDATA中将导致所有xml解析器将其作为XML文档的一部分进行读取。虽然在使用xml时很容易避免这个问题,为什么会有额外的头痛?
如果您想将HTML实际解析为DOM,那么最好阅读HTML文本,并设置解析器以单独阅读测试。
希望按照我的意图出现。
答案 6 :(得分:1)
就个人而言,我讨厌CDATA段,所以我会使用编码。当然,如果您将XML添加到XML到XML,那么这将导致编码而不是编码,从而导致一些非常难以理解的结果。 为什么我讨厌CDATA细分?我希望我知道。个人偏好,主要是。我只是不喜欢习惯在特殊片段中添加“禁用字符”,在这些片段中会突然再次允许它们。当我在CDATA段中看到XML标记并且它不是围绕它的XML的一部分时,它只会让我感到困惑。至少在编码时我会看到它是编码的。
良好的XML库将透明地处理编码和CDATA段。这只是我的眼睛受伤了。
答案 7 :(得分:0)
编码它将正常工作并且可靠。您可以毫无困难地编码编码的部分等。
解码将由用于处理编码HTML的任何XML解析器自动完成。
答案 8 :(得分:0)
我认为答案取决于您打算如何处理html内容,以及您计划支持哪种类型的html内容。
特别是当涉及到包含javascript时,编码通常会导致问题。 CDATA绝对可以帮到你。
如果你打算只使用小片段(即段落)并有办法预处理/过滤它(因为oyu不想要javascript或花哨的东西),你可能会更好的编码或实际上只是放它直接作为xml中的子树。然后,您还可以对html进行后期处理(即过滤器样式或onclick属性)。但这绝对是更多的工作。
答案 9 :(得分:0)
您可以同时使用两者的组合。
例如:您希望在xml节点中传递<h1>....</h1>
,您已使用CDATA部分传递它。 <h1>...</h1>
中的内容必须编码为html实体,例如<
,<
。
标签之间的编码将解决问题]]&gt;在转换为]]>
并且html标记不包含]]>
时进行互操作。
只有在您自己生成html时才能执行此操作。
答案 10 :(得分:0)
如果您的HTML格式正确,那么只需嵌入HTML标记,而无需转义或包装CDTATA。如果可能的话,将内容保存在XML中会有所帮助。它为您转换和操作文档提供了更大的灵活性。
您可以为HTML设置命名空间,以便您可以将HTML标记与包装它的其他XML消除歧义。
转义文本意味着整个HTML块将是一个大文本节点。在CDATA中包装告诉XML解析器不要解析该部分。它可能“更容易”,但限制你的能力下调,只应在适当的时候使用;不只是因为它更方便。 Escaped markup is considered harmful.