Miguel Altamirano Morales Ответов: 1

Проблема с wmlwriter в VB NET


Всем привет.

Я разрабатываю проект Visual Studio 2017 (Visual Basic), пытаясь сгенерировать XML-файл для проверки соответствующим DAC для электронного счета-фактуры.

- Я использую класс xmlWriter, который я использовал в прошлом, через Visual Studio 2010, и он работал просто отлично.

Но теперь, используя те же операторы, которые я использовал ранее, когда я пытаюсь использовать метод 'WriteStartElement', он терпит неудачу и отправляет сообщение:

"Carácter de nombre no válido en 'cfdi:Comprobante'. El carácter ':', con valor hexadecimal 0x3A, no puede incluirse en un nombre."

На английском языке (более или менее) "недопустимый символ в имени. Символ ':' с шестнадцатеричным значением 0x3A не может быть включен в имя".

- Я также использовал символ ascii (34) для объединения символа ""в текстовую строку, которая должна быть включена как часть литерала, но он генерирует пару"", а не только один, как я хочу. Подобный этому:

Дим Кадена как String = ":атрибут xsi=" + символ(34) + "http://www.w3.org/2001/XMLSchema-instance" + символ(34) + "атрибут xsi:schemaLocation =" + символ(34) + "http://www.uif.shcp.gob.mx/recepcion/ari Ари.xsd и" + символ(34) _
+ "xmlns =" + Chr(34) + "http://www.uif.shcp.gob.mx/recepcion/ari"

Может ли кто-нибудь помочь мне или подсказать, где искать эту пару сомнений ?

Заранее спасибо.

Что я уже пробовал:

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

Я не знаю, почему одни и те же процедуры прекрасно работали раньше, а не сейчас.

David_Wimbley

Можете ли вы опубликовать некоторые примеры кода, которые были бы наиболее полезны, вы опубликовали одну переменную, но лучше всего было бы написать весь xml-код, который вы пытаетесь сделать.

Miguel Altamirano Morales

Спасибо, что ответил, Дэвид.

Вот и вся субмарина:

Частный Sub Genera_XML()
Тусклая Кадена Как Струна
Кадена = ЧР(39) + "http://www.sat.gob.mx/cfd/3" + ЧР(39) + "атрибутов xmlns:xsi в =" + ЧР(39) + "протоколы HTTP//ВСП.В3.орг/2001/экземпляра xmlschema" + ЧР(39) + "атрибут xsi:schemaLocation =" + ЧР(39) + "http://www.sat.gob.mx/cfd/3" + ЧР(39) + "http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd" + ЧР(39)
Тусклые настройки как XmlWriterSettings = новые XmlWriterSettings()
настройки.Отступ = Истина
FileNameXML = strPath + "XMLFacturas\" + IDFiscal + ".XML"
На Ошибка goto msg_error
Использование writer как XmlWriter = XmlWriter.Создать(FileNameXML, настройки)
- Начинайте писать.
писатель.WriteProcessingInstruction("xml", "version='1.0' encoding='utf-8'")
писатель.WriteStartElement("cfdi:Comprobante")
писатель.WriteElementString("Version", "3.3")
писатель.WriteElementString("Serie", Mid(IDFiscal, 1, 3))
писатель.WriteElementString("Фолио", Mid(IDFiscal, 4, Len(IDFiscal) - 3))
писатель.WriteElementString("Fecha", Дата.Сегодня.Час)
писатель.WriteEndElement()
- Конечный документ.
писатель.Метод writeenddocument()
Конец Использования
Выход Из Субмарины
msg_error:
Отлаживать.Печать(Err.Описание)
Конец Подводной Лодки

Программа терпит неудачу, когда находит первого "писателя".Оператор WriteStartElement" (где он содержит символ ':' carácter).

Это код, который я хочу сгенерировать:

<cfdi:Comprobante
описание:cfdi все="http://www.sat.gob.mx/cfd/3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.sat.gob.mx/cfd/3
http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
……………..

an0ther1

См. обновленное решение - вам нужно использовать метод перегрузки WriteStartElement(String, String, String)

с уважением

1 Ответов

Рейтинг:
4

an0ther1

Я провел небольшое тестирование и определил, что вам нужно использовать одну из перегрузок XmlWriter.WriteStartElement, в частности; XmlWriter.Способ Методов Writestartelement (Строка, Строка, Строка) (System.Xml)[^]
Приведенный ниже фрагмент кода действительно работает и даст вам результат, который вы запросили в своем комментарии;

Dim sett as XmlWriter.Settings = New XMLWriterSettings();
sett.Indent = True
using writer as XmlWriter = XmlWriter.Create("Filename and Path", sett)
writer.WriteStartElement("cfdi", "Comprobante", "http://www.sat.gob.mx/cfd/3")
writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-Instance")
writer.WriteAttributeString("xmlns", "schemaLocation", null, "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cdv33.xsd")
' add additional elements
' write end element
writer.WriteEndElement()


Новая версия - откройте совершенно новый проект C# Windows Form, добавьте в форму одну кнопку. Приведенный ниже код можно ввести в событие button_click;

private void button1_Click(object sender, EventArgs e)
        {
            XmlWriter writer = null;

            try
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                writer = XmlWriter.Create("FileName.xml", settings);

                writer.WriteComment("sample XML fragment");
                writer.WriteStartElement("cfdi", "Comprobante", "http://www.sat.gob.mx/cfd/3");

                writer.WriteAttributeString("xmlns", "xsi", null, @"http://www.w3.org/2001/XMLSchema-Instance");
                writer.WriteAttributeString("xmlns", "schemaLoc", null, @"http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cdv33.xsd");

                writer.WriteStartElement("cfdi", "ElementName", "http://www.sat.gob.mx/cfd/3");
                writer.WriteString("This is my element string");
                writer.WriteEndElement();

                // Write the close tag for the root element.
                writer.WriteEndElement();

                // Write the XML to file and close the writer.
                writer.Flush();
                writer.Close();
            }

            finally
            {
                if (writer != null)
                    writer.Close();
            }
        }


Это приведет к выводу следующего XML-кода;

<?xml version="1.0" encoding="utf-8"?>
<!--пример XML-фрагмента-->
&ЛТ;cfdi все:Comprobante префиксом xmlns:xsi в="http://www.w3.org/2001/XMLSchema-Instance" префиксом xmlns:schemaLoc="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cdv33.xsd" префиксом xmlns:cfdi все="http://www.sat.gob.mx/cfd/3"&ГТ;
<cfdi:elementname>Это моя строка элемента



с уважением


Miguel Altamirano Morales

Спасибо за совет, мой друг. Я только что видел страницу, на которой ты меня уговаривал, и не мог найти ответа. WriteStartAttribute methid все еще говорит мне, что ":" недействительно

Miguel Altamirano Morales

ОК. Я получил то, что хотел, но теперь у меня есть еще одна проблема: он пишет только следующее:

<?xml version='1.0' encoding='utf-8'?>
<cfdi:Comprobante

в следующей инструкции он выдает ошибку: "El prefijo ""xmlns"" está reservado para su uso en XML." (префикс xmnls зарезервирован для его использования в XML)

Большое спасибо, что помогли мне еще раз; вы хороший человек, и я действительно ценю вашу доброту.

an0ther1

Не беспокойтесь, спасибо за переводы!!
Я иду по той же ошибке при использовании writer.WriteAttributeString("xmlns", "xsi", "http://myurl")
Вам нужно использовать перегрузку WriteAttributeString(string, string, string, string)
Если вы используете writer.WriteAttributeString("xmlns", "xsi", null, "http://myurl") это работает?

с уважением

Miguel Altamirano Morales

Мне пришлось уехать из города; как только я вернусь домой, я проверю это.

Спасибо.

Miguel Altamirano Morales

Привет, Нет, это не работает. Строка "xmlns" является первым параметром оператора writeattributestring, и я читал, что этот параметр является "префиксом" типа long. Это параметр, вызывающий ошибку.

Я думаю, что полное чтение или класс XMLWriter-это то, что мне нужно; печально то, что у меня нет времени. Еще один напряженный уик-энд !!! (если меня не уволят первым).

Надеюсь, вы и дальше будете мне помогать.

an0ther1

Извините, пришлось поработать - обратитесь к обновленному решению
Примечание: созданный XML-файл имеет закрывающие теги, но они удаляются при сохранении решения

с уважением

Miguel Altamirano Morales

ЙЕЕЕЕСС !!!. Я разработал маленькое приложение на C#, которое вы предложили, и оно отлично работало !!!.

Я получил те же ошибки, когда попытался преобразовать его в VB (все мое приложение находится в VB), но я увидел, что причиной была константа имени "null"; вот почему она никогда не работала раньше, я думаю. В первом случае я изменил на "vbnull", и это было то же самое, поэтому я изменил на "" и бинго !!!!!.

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