使用 XmlTextWriter 从 XmlTextReader 复制片段

Copy fragment from XmlTextReader using XmlTextWriter

当我使用 XmlTextReader 读取 XML 文件时,有时我需要保存一个节点,它是子节点。我使用 XmlTextWriter 执行此操作(我不喜欢这种方法)。

问题是 XmlTextReader 知道该片段在节点和属性的前缀中使用的一堆名称空间,但此时没有声明它们是在更高的位置声明的(通常但不总是在根节点中) ).

我可以告诉 XmlTextWriter 所有的命名空间,即使有些命名空间没有被使用。

我的第一个问题是,如何最好地将名称空间复制过来?我调用 XmlTextReader.GetNamespacesInScope (什么参数)?然后一个一个的调用XmlTextWriter.WriteAttributeString()写入每个命名空间?

如果我这样做,XmlTextWriter 是否足够聪明,知道这些是名称空间声明,因此不会在子节点中再次重写它们?

其次,如果我使用 XmlTextWriter.WriteAttributeString(localName, ns, value) 作为进入内部节点作用域的附加命名空间,添加这些命名空间是否足够聪明?或者我是否需要使用 XmlTextWriter.WriteAttributeString(prefix, uri)?

显式添加它

基本代码:

// this object is created, is reading XML, and hit a point below eventually...
XmlTextReader reader;

// ...

// On handling a specific XmlNodeType.Element
MemoryStream stream = new MemoryStream();
XmlTextWriter fragment = new XmlTextWriter(stream, utf8);
// What do I do here to get the namespaces in scope in reader into writer?

是的,解决方案是通过调用从 reader 复制命名空间:

reader.GetNamespacesInScope (System.Xml.XmlNamespaceScope.ExcludeXml)

并添加返回的所有命名空间。效果很好。