Новая строка в XML с помощью XmlTextWriter

у меня есть этот код:

Dim _xml As New XmlTextWriter(_percorso, System.Text.Encoding.UTF8)
_xml.Formatting = Formatting.Indented
_xml.Indentation = 7
_xml.WriteStartDocument()
_xml.WriteStartElement("DespatchAdvice")
_xml.WriteAttributeString("xmlns","urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2")
_xml.WriteAttributeString("xmlns:cac","urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")

Мне нужно, чтобы последняя строка с «xmlns:cac...» появлялась в моем xml в новой строке.

я пытаюсь использовать _xml.Settings.NewLineChars =vblf или добавьте & vblf до конца WriteAttributeString, но это не работает. В поисках решения я обнаружил, что XmlTextWriter — не лучшее решение, но у меня уже написано много кода с его использованием :-(

Вы видели метод WriteWhitespace?

Andrew Mortimer 13.08.2024 12:58

Я использовал его между двумя WriteAttributeString, но у меня возникла ошибка: токен StartAttribute в содержимом элемента состояния приведет к созданию недопустимого XML-документа.

Luca Geremei 13.08.2024 16:46

Как насчет stackoverflow.com/questions/71597678/…

Andrew Mortimer 13.08.2024 16:51

Я прочитал это, но думаю, что это не мой случай, я не могу изменить свой код таким образом.

Luca Geremei 13.08.2024 17:14

Я имею в виду, что ваш код показывает, что вы открываете элемент WriteStartElement, но не показывает, что вы его закрываете. Возможно, вы не правильно закрываете элементы?

Andrew Mortimer 13.08.2024 18:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если XmlTextWriter говорит вам не делать этого, я склонен этому поверить, хотя я протестировал показанный позже вывод с помощью одного онлайн-валидатора XML, и он сказал, что все в порядке.

Для нового кода, такого как этот, следует использовать XmlWriter. Нет ничего плохого в использовании новых технологий.

Вы можете обойти XmlTextWriter, написав в базовый поток, примерно так:

Dim ms As New MemoryStream()
Dim x As New XmlTextWriter(ms, System.Text.Encoding.UTF8) With {.Formatting = Formatting.Indented}

Dim crlf = Encoding.Unicode.GetBytes(vbCrLf)

x.WriteStartDocument()
x.WriteStartElement("DespatchAdvice")
x.WriteAttributeString("xmlns", "urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2")

'TODO: Don't write to the underlying stream.
x.Flush()
ms.Write(crlf)

x.WriteAttributeString("xmlns:cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")
x.WriteEndElement()
x.WriteEndDocument()
x.Flush()

ms.Position = 0
Dim sr As New StreamReader(ms)
Dim myStr = sr.ReadToEnd()
x.Close()

Console.WriteLine(myStr)

Console.ReadLine()

Выходы:

<?xml version = "1.0" encoding = "utf-8"?>
<DespatchAdvice xmlns = "urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2"
 xmlns:cac = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" />

Чтобы записать в файл:

Dim percoso = "C:\temp\123.xml" ' for example.

Using fs As New FileStream(percoso, FileMode.Create, FileAccess.Write)
    Dim x As New XmlTextWriter(fs, Encoding.UTF8) With {.Formatting = Formatting.Indented}

    Dim crlf = Encoding.Unicode.GetBytes(vbCrLf)

    x.WriteStartDocument()
    x.WriteStartElement("DespatchAdvice")
    x.WriteAttributeString("xmlns", "urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2")

    'TODO: Don't write to the underlying stream.
    x.Flush()
    fs.Write(crlf)

    x.WriteAttributeString("xmlns:cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")
    x.WriteEndElement()
    x.WriteEndDocument()
    x.Flush()
    x.Close()

End Using

Отлично, я меняю свое решение. Вопрос: в вашем примере вы используете XmlTextWriter с MemoryStream. Когда я закончу свою разработку, как сохранить ее в файле?

Luca Geremei 14.08.2024 09:43

Предположительно _percorso в вопросе был какой-то поток — вы можете использовать этот поток вместо MemoryStream.

Andrew Morton 14.08.2024 09:49

да, _percorso — это путь и файл, но я не понимаю, где его использовать в MemoryStream.

Luca Geremei 14.08.2024 10:17

@LucaGeremei Я добавил в свой ответ дополнительный фрагмент кода, но вместо этого записал его в файл.

Andrew Morton 14.08.2024 11:53

Отлично, я думал, вы говорили мне сделать это с помощью MemoryStream.

Luca Geremei 14.08.2024 12:19

@LucaGeremei Я рад, что в конце концов все заработало :) Если вы еще не видели эту страницу помощи: Что мне делать, когда кто-то отвечает на мой вопрос?

Andrew Morton 14.08.2024 16:11

Другие вопросы по теме