Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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/8/http/4.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# 如何将xml片段解析为节点,并将它们附加到具有指定默认命名空间的节点,以便它们成为该命名空间的一部分?_C#_Xml - Fatal编程技术网

C# 如何将xml片段解析为节点,并将它们附加到具有指定默认命名空间的节点,以便它们成为该命名空间的一部分?

C# 如何将xml片段解析为节点,并将它们附加到具有指定默认命名空间的节点,以便它们成为该命名空间的一部分?,c#,xml,C#,Xml,我有以下的意见 <row test="1" /> 并希望在使用XmlTextWriter时生成以下输出 <?xml version="1.0"?> <root xmlns="urn:default"> <row test="1" /> </root> 根据InnerXml()的文档,以下代码应该可以正常工作 var outputdoc = new XmlDocument(); outputdoc.AppendChild(

我有以下的意见

<row test="1" />

并希望在使用XmlTextWriter时生成以下输出

<?xml version="1.0"?>
<root xmlns="urn:default">
  <row test="1" />
</root>


根据InnerXml()的文档,以下代码应该可以正常工作

var outputdoc = new XmlDocument();
outputdoc.AppendChild(outputdoc.CreateXmlDeclaration("1.0", string.Empty, string.Empty));
outputdoc.AppendChild(outputdoc.CreateElement("root", "urn:default"));
outputdoc.DocumentElement.InnerXml = "<row test=\"1\" />";

var writer = new XmlTextWriter(filename, Encoding.UTF8) { Formatting = Formatting.Indented, Indentation = 1 };
outputdoc.WriteTo(writer);
writer.Close();
var outputdoc=new XmlDocument();
AppendChild(outputdoc.CreateXmlDeclaration(“1.0”,string.Empty,string.Empty));
outputdoc.AppendChild(outputdoc.CreateElement(“根”,“urn:默认”);
outputdoc.DocumentElement.InnerXml=“”;
var writer=newXMLTextWriter(文件名,Encoding.UTF8){Formatting=Formatting.Indented,Indentation=1};
outputdoc.WriteTo(编写器);
writer.Close();
相反,我得到以下输出:

<?xml version="1.0"?>
<root xmlns="urn:default">
  <row test="1" xmlns="" />
</root>

我需要做什么

编辑:

我没有把可能的输入弄清楚。它应该是一个Xml片段,因此它可以是一个元素,在任何情况下都可以是多个具有任意数量子元素的元素。例如:

<row test="1" />


1

1

必须使用System.Xml吗?如果要使用XElement,那么它将非常简单:

XElement root = new XElement(XName.Get("root", "urn:default"));
XElement child = XElement.Parse("<row test=\"1\" />");
root.Add(child);
child.Name = XName.Get("row", "urn:default");
Console.WriteLine(root.ToString());
XElement root=new-XElement(XName.Get(“root”,“urn:default”);
XElement child=XElement.Parse(“”);
root.Add(子级);
child.Name=XName.Get(“行”、“urn:default”);
Console.WriteLine(root.ToString());
打印出:

<root xmlns="urn:default">
    <row test="1" />
</root>

您可以使用XmlTextWriter将其全部写出来,尽管我建议您要谨慎,除非您确定它正在使用默认名称空间执行您想要的操作

using(var writer = new XmlTextWriter(filename, Encoding.UTF8) { Formatting = Formatting.Indented, Indentation = 1 }) {
    writer.WriteStartDocument();
    writer.WriteStartElement("row","urn:default");
    writer.WriteRaw("<row test=\"1\" />");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}
使用(var writer=newxmltextwriter(文件名,Encoding.UTF8){Formatting=Formatting.Indented,Indentation=1}){
writer.WriteStartDocument();
writer.writeStart元素(“行”、“urn:default”);
writer.WriteRaw(“”);
writer.writeedelement();
writer.WriteEndDocument();
}

这是因为您在不一致地操作XML:首先,您使用处理名称空间的API正确地构建元素,然后使用
InnerXML
构建元素

<row test="2"/> 
编辑:关于@somori评论,来自此

设置此属性将替换 已解析的节点的子节点 给定字符串的内容。这个 解析是在当前数据库中完成的 命名空间上下文

此属性是Microsoft扩展 到文档对象模型(DOM)


DOM的扩展意味着非标准…

在这种情况下使用XSLT会更简单吗?System.Xml不是绝对必要的。是否还有一种方法可以解析以下字符串“”?是的,但由于这在技术上不是有效的XML(该片段包含多个根节点),因此必须进行一些黑客操作,比如用包含元素包围字符串。i、 e.“……”。然后,一旦您解析了它,您就可以抓取子节点(并忽略伪父元素)。根据文档,将InnerXml设置为没有名称空间定义的XML片段应该将该片段放在默认名称空间中。我的输入xml几乎可以是任何东西,但都将在同一个名称空间中,然后我必须使用正确的名称空间强制输入到正确的父元素中。我已经意识到这个描述不够清晰,需要更好的测试。@somori:不一致的文档似乎是非标准扩展的问题之一……谢谢。它适用于名称空间操作。不幸的是,这个解决方案删除了漂亮的打印,所以它对我不起作用。
<root xmlns="urn:default">
    <row test="1" />
</root>
using(var writer = new XmlTextWriter(filename, Encoding.UTF8) { Formatting = Formatting.Indented, Indentation = 1 }) {
    writer.WriteStartDocument();
    writer.WriteStartElement("row","urn:default");
    writer.WriteRaw("<row test=\"1\" />");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}
<row test="2"/> 
outputdoc.DocumentElement.InnerXml = "<row test=\"1\" xmlns=\"urn:default\" />";