当我使用XmlTextReader读取XML文件时,我有时需要保存节点,而且它是子节点。我这样做是使用XmlTextWriter(我没有采用这种方法)。
问题是XmlTextReader知道这个片段在节点和属性的前缀中使用的一堆命名空间,但是在那时没有声明它们被声明为更高(通常但不总是在根节点中)。
我很好地告诉XmlTextWriter所有命名空间,即使没有使用某些命名空间。
我的第一个问题是,如何最好地复制名称空间?我是否调用XmlTextReader.GetNamespacesInScope(什么参数)?然后逐个调用XmlTextWriter.WriteAttributeString()来编写每个命名空间?
如果我这样做,XmlTextWriter是否足够聪明,知道这些是名称空间声明,因此不会在子节点中再次重写它们?
其次,如果我将XmlTextWriter.WriteAttributeString(localName,ns,value)用于进入内部节点范围的其他命名空间,那么添加这些命名空间是否足够智能?或者我是否需要使用XmlTextWriter.WriteAttributeString(前缀,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?
答案 0 :(得分:0)
是的,解决方案是通过调用以下方式从阅读器复制命名空间:
reader.GetNamespacesInScope (System.Xml.XmlNamespaceScope.ExcludeXml)
并添加返回的所有命名空间。效果很好。