【问题标题】:Generate System.Xml.XmlDocument.OuterXml() output thats valid in HTML生成在 HTML 中有效的 System.Xml.XmlDocument.OuterXml() 输出
【发布时间】:2009-11-30 22:59:29
【问题描述】:

System.Xml.XmlDocument.OuterXml() 将生成(例如)

<list id="myBooks">
  <book id="123" name="XML for muppets" />
  <book id="456" name="HTML for fools" />
</list>

如果您想将此 xml 嵌入 HTML 页面,那么它在 IE 中可以正常工作(因为 xml 数据岛是对 html 标准的扩展)

但是对于 Firefox,您需要使用类似的方式加载此 unknown html tag that happens to contain xml into a DOMParser

var list = document.getElementById("myBooks");
var doc = new DOMParser().parseFromString(list.outerHTML);

但是因为 &lt;tag /&gt; is not == &lt;tag&gt;&lt;/tag&gt; 在 HTML firefox 中将 list.outerHTML 视为

<list>
  <book id="123" name="XML for muppets">
     <book id="456" name="HTML for fools">
     </book>
  </book>
</list>

那么如何让 XmlDocument.OuterXml() 输出 xml 将完整的结束标签而不是速记?

编辑 - 添加示例来说明

<html><body>
<xml id="myBooks">
<list>
  <book id="123" name="XML for muppets" />
  <book id="456" name="HTML for fools" />
</list>
</xml>
<script>
var oXml = document.getElementById("myBooks");
alert(oXml.innerHTML);
</script>
</body></html>

【问题讨论】:

  • 我还应该说,为 XHTML 添加(不同的)doctype 不是一种选择,也不是使用 XMLHttpRequest 加载 xml - 它必须是内联的。
  • 我刚刚使用 XHTML 严格和过渡文档类型测试了上述内容 - 仍然不能正确解释自闭标签 (FF3.5)
  • 当然,您需要使用不同的 mime 类型来让 Firefox 将输入解释为 xml,但它在 IE 中将无法工作。 Josh Einstein 关于使用 XmlWriter 而不是 OuterXml 的建议对我来说似乎是一个好方法。
  • 另一个小问题 - 如果您的 xml 包含任何大小写混合的标记或属性名称,它们将被转换为小写。

标签: c# xml


【解决方案1】:

我很困惑。是什么让您认为 Firefox 将无法解释自闭合 XML 标签?包括 Firefox 在内的所有主流浏览器都支持 XHTML,它允许您在没有内容的任何地方使用此类自闭合标签。为什么 XML 数据岛会有所不同?

此外,您可能希望查看使用 XmlTextWriter 写入 StringWriter 或其他内容。您可以使用 XmlWriterSettings 配置 XmlTextWriter,指定 Html 的 XmlOutputMethod,可以提供更多类似 HTML 的输出。

更新 不幸的是,我刚刚对此进行了测试,并且 OutputMethod 属性有一个内部设置器。但出于好奇,我使用反射来设置它,它确实改变了 XML 输出,使得自关闭标签变成了单独的关闭标签。代码如下。

var stream = new System.IO.StringWriter();
var xmldoc = new System.Xml.XmlDocument();
xmldoc.LoadXml("<root><child><grandchild /></child><child /></root>");

var settings = new System.Xml.XmlWriterSettings();
var propInfo = settings.GetType().GetProperty("OutputMethod");
propInfo.SetValue(settings, System.Xml.XmlOutputMethod.Html, null);
var writer = System.Xml.XmlWriter.Create(stream, settings);

xmldoc.Save(writer);

stream.ToString().Dump();

【讨论】:

  • 是什么让我认为它不是测试 ;) 请参阅编辑示例。
  • 对不起,我的意思并不是我怀疑你——但这对于 FireFox 来说确实是一个错误,它会忽略这样的自动关闭标签,特别是如果你在XHTML 页面。
  • 我一直在与这个作斗争,直到凌晨 - 为什么 - 哦 - 为什么 .OutputMethod 有一个内部设置器?我认为使用反射对我不起作用(CAS),所以我想出了下面的问题。
【解决方案2】:

这有点杂乱无章,但会在任何空节点中添加一个空格,以便更改

<book id="123" name="XML for muppets" />

进入

<book id="123" name="XML for muppets"> </book>

期待出现在 DailyWTF!

addSpaceToEmptyNodes(xmlDoc.FirstChild);

private void addSpaceToEmptyNodes(XmlNode node)
    {
        if (node.HasChildNodes)
        {
            foreach (XmlNode child in node.ChildNodes)
                addSpaceToEmptyNodes(child);
        }
        else         
            node.InnerText = " ";
    }

【讨论】:

  • 出于好奇,我发现您可以类似地获得所需的输出,而无需更改 XML 以在文本节点中留出空格。做你正在做的同样的事情,除了 node.InnerText = " ",做 node.AppendChild(node.OwnerDocument.CreateTextNode(""))。这样文档在结构上将是相同的。
  • 还应该检查节点是否已经包含任何文本,不是吗?
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2021-06-04
  • 1970-01-01
  • 2013-03-01
相关资源
最近更新 更多