【问题标题】:Html inside XML. Should I use CDATA or encode the HTML [closed]XML 中的 HTML。我应该使用 CDATA 还是编码 HTML [关闭]
【发布时间】:2010-11-26 18:45:20
【问题描述】:

我正在使用 XML 来共享 HTML 内容。 AFAIK,我可以通过以下方式嵌入 HTML:

  • 对其进行编码:我不知道使用起来是否完全安全。而且我还得重新解码。

  • 使用 CDATA 部分:我相信,如果内容包含结束标记“]]>”和某些十六进制字符,我仍然会遇到问题。另一方面,XML 解析器会为我透明地提取信息。

我应该选择哪个选项?

更新:xml 将在 java 中创建并作为字符串传递给 .net Web 服务,如果它会被解析回来。因此,我需要能够将 xml 导出为字符串并使用“doc.LoadXml(xmlString);”加载它

【问题讨论】:

    标签: xml cdata html-encode


    【解决方案1】:

    CDATA 为简单起见。

    【讨论】:

      【解决方案2】:

      对其进行编码可以正常工作并且可靠。您可以毫无困难地对编码部分等进行编码。

      任何用于处理编码 HTML 的 XML 解析器都会自动完成解码。

      【讨论】:

        【解决方案3】:

        我认为答案取决于您计划对 html 内容做什么,以及您计划支持哪种类型的 html 内容。

        尤其是涉及到包含的 javascript 时,编码通常会导致问题。 CDATA 绝对可以帮助您。

        如果你打算只使用小的 sn-ps(即一个段落)并且有办法预处理/过滤它(因为 oyu 不想要 javascript 或花哨的东西),你可能会更好地使用编码或实际上只是将它直接作为子树放在 xml 中。然后,您还可以对 html 进行后处理(即过滤器样式或 onclick 属性)。但这肯定是更多的工作。

        【讨论】:

          【解决方案4】:

          我不知道您使用的是什么 XML 构建器,但 PHP(实际上是 libxml)知道如何处理 CDATA 部分中的]]>,其他所有 XML 框架也应该如此。所以,我会使用 CDATA 部分。

          【讨论】:

            【解决方案5】:

            您可以将两者结合使用。 例如:您想在 xml 节点中传递 <h1>....</h1>,您必须使用 CDATA 部分来传递它。 <h1>...</h1> 中的内容必须编码为 html 实体,例如<,代表<。 标签之间的编码将解决]]> 在转换为]]> 和html 标签不包含]]> 时被解释的问题。

            只有自己生成html才能做到这一点。

            【讨论】:

              【解决方案6】:

              在 CDATA 中包装 HTML 是有意义的。 HTML 文本可能会构成 XML 中的单个值。

              因此不将其包装在 CDATA 中将导致所有 xml 解析器将其作为 XML 文档的一部分进行读取。虽然在使用 xml 时很容易绕过这个问题,但为什么会额外头疼呢?

              如果你想真正将 HTML 解析成 DOM,那么最好读取 HTML 文本,并设置一个解析器来单独读取测试。

              希望结果能如我所愿。

              【讨论】:

                【解决方案7】:

                CDATA 更​​易于肉眼阅读,而编码内容可以安全地在其中包含 CDATA 结束标记 — 但您不必关心。只需使用 XML 库,就不用担心它了。然后您只需要说“将此文本放入此元素中”,该库将对其进行编码或将其包装在 CDATA 标记中。

                【讨论】:

                  【解决方案8】:

                  就我个人而言,我讨厌 CDATA 段,所以我会改用编码。当然,如果您将 XML 添加到 XML 到 XML,那么这将导致编码超过编码,从而导致一些非常不可读的结果。 为什么我讨厌 CDATA 段?我希望我知道。个人喜好,主要是。我只是不喜欢习惯在特殊段内添加“禁止字符”,在那里它们会突然再次被允许。当我在 CDATA 段中看到 XML 标记并且它不是围绕它的 XML 的一部分时,它只会让我感到困惑。至少通过编码我会看到它被编码了。

                  好的 XML 库可以透明地处理编码和 CDATA 段。受伤的只是我的眼睛。

                  【讨论】:

                    【解决方案9】:

                    这两个选项几乎完全相同。这是您的两个选择:

                    <html>This is &lt;b&gt;bold&lt;/b&gt;</html>
                    
                    <html><![CDATA[This is <b>bold</b>]]></html>
                    

                    在这两种情况下,您都必须检查您的字符串是否有特殊字符被转义。很多人假装 CDATA 字符串不需要任何转义,但正如您所指出的,您必须确保 "]]>" 不会在未转义的情况下滑入。

                    在这两种情况下,XML 处理器都会将解码后的字符串返回给您。

                    【讨论】:

                    • 我选择不使用 CDATA 的一个原因是,通常大多数数据不需要转义,而且在不需要转义的文本上看到这么多 CDATA 包装器是一团糟.第一种方法意味着你偶尔会有 HTML 编码,但大多数时候你有漂亮干净的文本,没有不必要的包装。当然,根据您的典型数据,这可能会有所不同。
                    【解决方案10】:

                    如果您的 HTML 格式正确,则只需嵌入 HTML 标记,而无需在 CDTATA 中转义或换行。如果可能的话,将内容保存在 XML 中会有所帮助。它为您转换和操作文档提供了更大的灵活性。

                    您可以为 HTML 设置一个命名空间,这样您就可以将您的 HTML 标记与包装它的其他 XML 消除歧义。

                    转义文本意味着整个 HTML 块将是一个大文本节点。包装在 CDATA 中告诉 XML 解析器不要解析该部分。它可能“更容易”,但会限制你的能力范围,只能在适当的时候使用;不仅仅是因为它更方便。 Escaped markup is considered harmful.

                    【讨论】:

                    • HTML 不一定是有效的 XML(例如,HTML 不需要结束标签)。它们看起来很相似,因为它们共享 SGML 作为它们的共同祖先。唯一的选择实际上是转义数据或使用 cdata。否则 XML 解析器会在发现格式错误的标记时崩溃。
                    【解决方案11】:

                    如果使用 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&amp;iwloc=A&amp;t=h&amp;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&amp;iwloc=A&amp;t=h&amp;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&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
                                ]]>
                            </content>
                        </command>
                    </response>
                    

                    在 javascript 中,您将通过将 xml(例如 jquery)加载到下面的 xmlDoc 之类的变量中进行解码,然后获取 content 标记的第二次出现(item(1))的节点值

                    xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue
                    

                    或(两个符号是等价的)

                    xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-01-23
                      • 2010-12-31
                      • 2011-01-14
                      • 1970-01-01
                      • 2012-03-10
                      • 1970-01-01
                      相关资源
                      最近更新 更多