у меня есть этот код:
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 — не лучшее решение, но у меня уже написано много кода с его использованием :-(
Я использовал его между двумя WriteAttributeString, но у меня возникла ошибка: токен StartAttribute в содержимом элемента состояния приведет к созданию недопустимого XML-документа.
Как насчет stackoverflow.com/questions/71597678/…
Я прочитал это, но думаю, что это не мой случай, я не могу изменить свой код таким образом.
Я имею в виду, что ваш код показывает, что вы открываете элемент WriteStartElement
, но не показывает, что вы его закрываете. Возможно, вы не правильно закрываете элементы?
Если 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. Когда я закончу свою разработку, как сохранить ее в файле?
Предположительно _percorso
в вопросе был какой-то поток — вы можете использовать этот поток вместо MemoryStream.
да, _percorso — это путь и файл, но я не понимаю, где его использовать в MemoryStream.
@LucaGeremei Я добавил в свой ответ дополнительный фрагмент кода, но вместо этого записал его в файл.
Отлично, я думал, вы говорили мне сделать это с помощью MemoryStream.
@LucaGeremei Я рад, что в конце концов все заработало :) Если вы еще не видели эту страницу помощи: Что мне делать, когда кто-то отвечает на мой вопрос?
Вы видели метод
WriteWhitespace
?