Когда я читаю файл XML с помощью XmlTextReader, мне иногда нужно сохранить узел и его дочерние элементы. Я делаю это с помощью 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?
XmlWriter.WriteNode Method (XmlReader, Boolean)
для копирования изXmlReader
(базовый классXmlTextReader
) наXmlWriter
, вы его используете? - person dbc   schedule 02.06.2018XmlTextReader
иXmlTextWriter
устарели в соответствии с их документацией, в которой рекомендуется создавать экземпляры их базовые классы вместо этого. - person dbc   schedule 02.06.2018