Скопируйте фрагмент из XmlTextReader с помощью XmlTextWriter

Когда я читаю файл 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?

person David Thielen    schedule 02.06.2018    source источник
comment
Почему вы пытаетесь объяснить свой случай вместо того, чтобы публиковать некоторые конкретные примеры xml и свой код, который вы пробовали?   -  person Eser    schedule 02.06.2018
comment
Чтобы мы могли вам помочь, поделитесь минимально воспроизводимым примером. Уже существует XmlWriter.WriteNode Method (XmlReader, Boolean) для копирования из XmlReader (базовый класс XmlTextReader ) на XmlWriter, вы его используете?   -  person dbc    schedule 02.06.2018
comment
Также обратите внимание, что XmlTextReader и XmlTextWriter устарели в соответствии с их документацией, в которой рекомендуется создавать экземпляры их базовые классы вместо этого.   -  person dbc    schedule 02.06.2018
comment
@dbc - К сожалению, WriteNode() не будет работать, потому что мне нужно проанализировать узлы, которые я читаю, в дополнение к сохранению фрагмента. Итак, узел за узлом, я обрабатываю их, а также записываю их во фрагмент с помощью XmlTextWriter.   -  person David Thielen    schedule 02.06.2018
comment
Тогда было бы здорово увидеть минимально воспроизводимый пример, показывающий вашу проблему.   -  person dbc    schedule 02.06.2018
comment
@dbc - я только что добавил фрагмент кода. Я пытался сделать это простым, потому что код, который на самом деле работает вокруг этого, будет состоять из 40+ строк, мешающих ответить на вопрос.   -  person David Thielen    schedule 02.06.2018


Ответы (1)


Да, решение состоит в том, чтобы скопировать пространства имен из считывателя, вызвав:

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

и добавление во все возвращенные пространства имен. Работает отлично.

person David Thielen    schedule 02.06.2018