Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成在HTML中有效的System.Xml.XmlDocument.OuterXml()输出_C#_Xml - Fatal编程技术网

C# 生成在HTML中有效的System.Xml.XmlDocument.OuterXml()输出

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

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>

那么,我如何让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 = " ";
    }