Скопируйте фрагмент из XmlTextReader, используя XmlTextWriter - PullRequest
0 голосов
/ 02 июня 2018

Когда я читаю XML-файл с помощью XmlTextReader, мне иногда нужно сохранять данные на узле, а это дочерние элементы.Я делаю это с помощью XmlTextWriter (я не женат на этом подходе).

Проблема в том, что XmlTextReader знает о множестве пространств имен, которые этот фрагмент использует в префиксах на узлах и атрибутах, но не объявляет вэта точка была объявлена ​​выше (обычно, но не всегда в корневом узле).

Я хорошо говорю XmlTextWriter обо всех пространствах имен, даже если некоторые не используются.

MyПервый вопрос: как мне лучше скопировать пространства имен?Я вызываю 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?

1 Ответ

0 голосов
/ 03 июня 2018

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

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

и добавив все возвращенные пространства имен.Прекрасно работает.

...