C# 生成在HTML中有效的System.Xml.XmlDocument.OuterXml()输出
System.Xml.XmlDocument.OuterXml()将生成(例如) 但是,因为在HTML中,firefox会将list.outerHTML视为C# 生成在HTML中有效的System.Xml.XmlDocument.OuterXml()输出,c#,xml,C#,Xml,System.Xml.XmlDocument.OuterXml()将生成(例如) 但是,因为在HTML中,firefox会将list.outerHTML视为 <list> <book id="123" name="XML for muppets"> <book id="456" name="HTML for fools"> </book> </book> </list> 那么,我如何让Xml
<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>
var-oXml=document.getElementById(“myBooks”);
警报(oXml.innerHTML);
我很困惑。是什么让您认为Firefox无法解释自动关闭的XML标记?包括Firefox在内的所有主流浏览器都支持XHTML,它允许您在没有内容的任何地方使用这种自动关闭标记。为什么XML数据岛会有所不同
此外,您可能希望了解如何使用XmlTextWriter向StringWriter或其他对象进行写入。您可以使用配置来指定一组Html,以提供更多类似Html的输出
更新
不幸的是,我刚刚测试了这个,OutputMethod属性有一个内部setter。但出于好奇,我使用了反射来设置它,事实上它确实改变了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();
var stream=new System.IO.StringWriter();
var xmldoc=new System.Xml.XmlDocument();
xmldoc.LoadXml(“”);
var settings=new System.Xml.XmlWriterSettings();
var propInfo=settings.GetType().GetProperty(“OutputMethod”);
SetValue(设置,System.Xml.XmlOutputMethod.Html,null);
var writer=System.Xml.XmlWriter.Create(流、设置);
保存(writer);
stream.ToString().Dump();
我很困惑。是什么让您认为Firefox无法解释自动关闭的XML标记?包括Firefox在内的所有主流浏览器都支持XHTML,它允许您在没有内容的任何地方使用这种自动关闭标记。为什么XML数据岛会有所不同
此外,您可能希望了解如何使用XmlTextWriter向StringWriter或其他对象进行写入。您可以使用配置来指定一组Html,以提供更多类似Html的输出
更新
不幸的是,我刚刚测试了这个,OutputMethod属性有一个内部setter。但出于好奇,我使用了反射来设置它,事实上它确实改变了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();
var stream=new System.IO.StringWriter();
var xmldoc=new System.Xml.XmlDocument();
xmldoc.LoadXml(“”);
var settings=new System.Xml.XmlWriterSettings();
var propInfo=settings.GetType().GetProperty(“OutputMethod”);
SetValue(设置,System.Xml.XmlOutputMethod.Html,null);
var writer=System.Xml.XmlWriter.Create(流、设置);
保存(writer);
stream.ToString().Dump();
这有点混乱,但会在任何空节点中添加一个空间,因此会发生变化
<book id="123" name="XML for muppets" />
这有点混乱,但会在任何空节点中添加一个空间,因此会发生变化
<book id="123" name="XML for muppets" />
我还应该说,为XHTML添加一个(不同的)doctype不是一个选项,也不是使用XMLHttpRequest加载xml-它必须是内联的。我刚刚用XHTML严格和过渡doctype测试了上述内容-仍然不能正确解释自动关闭标记(FF3.5)确定,您需要使用不同的mime类型来让Firefox将输入解释为xml,但是,在IE中,Josh Einstein关于使用XmlWriter而不是OuterXml的建议是行不通的。对我来说,这似乎是一个好方法。还有一个小问题——如果xml包含任何大小写混合的标记或属性名称,它们将转换为小写。我还应该说,添加一个(不同的)XHTML的doctype不是一个选项,也不是使用XMLHttpRequest加载xml-它必须是内联的。我刚刚用XHTML严格和过渡doctype测试了上述内容-仍然无法正确解释自动关闭标记(FF3.5)。当然,您需要使用不同的mime类型才能让Firefox将输入解释为xml,但在IE中,它不起作用。Josh Einstein建议使用XmlWriter而不是OuterXml,这对我来说似乎是一个好方法。另一个小问题是,如果xml包含任何大小写混合的标记或属性名称,它们将转换为小写。我怎么会认为它不起作用呢?这是一个测试;)请参见示例编辑。抱歉,这听起来并不是我怀疑你的意思,但FireFox忽略了自动关闭标签,这听起来确实像是一个bug,尤其是当你在XHTML页面中看到相同的行为时。我一直在与这个问题作斗争,直到凌晨-为什么.OutputMethod有一个内部setter?使用反射对我来说是行不通的,我想(CAS),所以我想出了下面的难题。是什么让我觉得它不管用呢?这是一个测试;)请参见示例编辑。抱歉,这听起来并不是我怀疑你的意思,但FireFox忽略了自动关闭标签,这听起来确实像是一个bug,尤其是当你在XHTML页面中看到相同的行为时。我一直在与这个问题作斗争,直到凌晨-为什么.OutputMethod有一个内部setter?我认为使用反射(CAS)对我来说是行不通的,所以我提出了下面的难题。出于好奇,我发现您可以同样获得所需的输出,而无需更改XML以在文本节点中留有空间。执行与您正在执行的操作相同的操作,但不执行node.InnerText=“”,而是执行node.AppendChild(node.OwnerDocument.CreateTextNode(“”))。这样,文档在结构上是相等的。还应该检查节点是否已经包含任何文本,不是吗?出于好奇,我发现您可以同样获得所需的输出,而无需更改XML以在文本节点中留有空间。执行与您正在执行的操作相同的操作,但不执行node.InnerText=“”,而是执行node.AppendChild(node.OwnerDocument.CreateTextNode(“”))。这样,文档在结构上是相等的。还应该检查节点是否已经包含任何文本,不是吗?
<book id="123" name="XML for muppets"> </book>
addSpaceToEmptyNodes(xmlDoc.FirstChild);
private void addSpaceToEmptyNodes(XmlNode node)
{
if (node.HasChildNodes)
{
foreach (XmlNode child in node.ChildNodes)
addSpaceToEmptyNodes(child);
}
else
node.InnerText = " ";
}