Java xml api: выбираем правильно. stax: работаем с удовольствием

XSL

Стиль генерирует XHTML-код, в виде списка UL, состоящего из негруппированных контактов и вложенных списков для групп. Поскольку результат вывода именно XHTML, требования к оформлению результата несколько строже, чем если бы это был обычный HTML

Поэтому следует обратить внимание на следующие моменты:

Важно: В результате преобразования должен получаться файл с одной и только одной корневой нодой, иначе Safari и Google Chrome (Читай: WebKit) не смогут добавить результирующий элемент в документ. Это довольно разумно, поскольку для всех XML объектов (результат в виде XHTML из их числа) есть правило: корневой элемент должен быть только один (There can be the only one).

Важно: В качестве xsl:output method должен быть указан либо xml либо html (однако, в последнем случае, при использовании пронстранств имён, таковые будут потеряны)

Некоторые ставят это значение в xhtml и в результате получают некорректную обработку или ошибки на клиенте — пока этого метода не введено и не следует его использовать. Для этого есть media-type.
Код генерируется без заголовков XML: omit-xml-declaration установлен в yes и xmlns не указывается, иначе в результате получится недоXHTML-файл с XML-заголовком, не содержащий html, head и body. Генерация DOCTYPE (doctype-system, doctype-public) также отключена.

<?xmlversion="1.0"encoding="utf-8"?><xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:c="http://any-developer.name"exclude-result-prefixes="c"><xsl:outputmethod="xml"encoding="utf-8"standalone="yes"indent="yes"omit-xml-declaration="yes"media-type="text/xhtml"/><xsl:templatename="contact"><li><ahref="javascript:alert('{@type}')"title="{@type}"id="contact-{@type}-sitelink"><imgalt="{@type}"src="{@type}.ico"id="contact-{@type}-icon"class="contact-icon"/></a><xsl:iftest="c:name"><ahref="javascript:alert('{@type}:{c:id}');"id="contact-{@type}-link"title="{c:id}"alt="{c:name}"class="contact-link"><xsl:value-ofselect="c:name"/></a></xsl:if><xsl:iftest="not(c:name)"><ahref="javascript:alert('{@type}:{c:id}');"id="contact-{@type}-link"title="{c:id}"alt="{c:id}"class="contact-link"><xsl:value-ofselect="c:id"/></a></xsl:if><spanclass="contact-type">(<xsl:value-ofselect="@type"/>)</span></li></xsl:template><xsl:templatematch="/c:contacts"><ulid="contacts"><xsl:for-eachselect="./c:contact"><xsl:call-templatename="contact"/></xsl:for-each><xsl:for-eachselect="./c:group"><li><xsl:iftest="c:name"><spanclass="contact-group-name"><xsl:value-ofselect="c:name"/></span></xsl:if><ulid="{@shortname}"><xsl:for-eachselect="./c:contact"><xsl:call-templatename="contact"/></xsl:for-each></ul></li></xsl:for-each></ul></xsl:template></xsl:stylesheet>

В результате преобразования получается такой блок XHTML:

Аннотация

Документы языка разметки (XML) содержат элементы и атрибуты и предоставляют гибкий и мощный способ обмена данными между приложениями и организациями. Чтобы указать допустимую структуру и содержимое документа XML, можно написать определение типа документа (DTD), схему Microsoft XML-Data Reduced (XDR) или схему определения XML-схемы (XSD).

Схемы XSD являются предпочтительным способом указать грамматики XML в платформа .NET Framework, но схемы DTD и XDR также поддерживаются.

В этой статье вы узнаете, как применить схему DTD, XDR или схему XSD к XML-документу в Microsoft Visual Basic 2005 г. или в Microsoft Visual Basic .NET. Затем вы узнаете, как использовать класс XmlValidatingReader для проверки XML-документа в отношении указанной грамматики. Вы также узнаете, как использовать класс XmlSchemaCollection для кэширования схем в памяти в качестве способа оптимизации проверки XML.

3 ответа

Решение

Вы должны добавить это вручную. SQL Server всегда хранит XML внутри себя как ucs-2, поэтому для SQL невозможно сгенерировать его заголовок кодировки utf-8

См. «Ограничения типа данных xml» в MSDN.

37

2012-01-25 12:10

Когда я читал этот пост, я думал, что это был «конец строки»… нет решения… Я почти разочаровался в подходе… но на самом деле есть способ обойти это ограничение путем преобразования XML varchar(max) и затем добавление объявления в начало строки. Следующий пост показывает, как:

Простой пример будет выглядеть примерно так:

Выход:

6

2014-01-24 20:15

Принятый ответ «добавить его вручную», хотя и технически правильный, является неполным и, следовательно, вводящим в заблуждение. Простое добавление объявления XML с любой «кодировкой», которую вы хотите, не меняет фактическую кодировку строки. Это иногда хорошо. Если вы укажете «UTF-8» и конвертируете данные для затем, если все символы являются стандартными символами ASCII (значения 1–127), то, конечно, это UTF-8 (по крайней мере, заметной разницы нет). НО, если есть какие- либо символы со значениями 128 или выше, то у вас нет XML-документа в кодировке UTF-8. И если вы преобразуете данные XML в затем у вас есть документ в кодировке UTF-16, независимо от того, что вы вручную указали в объявлении XML. Вы должны только указать кодировку, ЕСЛИ это фактическая используемая кодировка.

И до SQL Server 2019 (в настоящее время в бета-версии на CTP 2.1) не было никакого способа получить кодировку UTF-8 в SQL Server, по крайней мере, без использования SQLCLR. Но в SQL Server 2019 вы можете теперь преобразовать XML в фактический UTF-8:

Это возвращает:

Поскольку многие люди некоторое время не будут работать на SQL Server 2019, это возможно через SQLCLR. Вы можете использовать классы.NET Xml (например,) экспортировать это с различными вариантами. Фактически я создал библиотеку функций SQLCLR, SQL #, которая включает в себя такую ​​функцию: XML_SaveToFile. Функция XML_SaveToFile позволяет указать любую допустимую кодировку, и она установит это в объявлении XML и обеспечит сохранение файла с этой кодировкой. Он также имеет опции для отступа, перехода на новую строку и т. Д. Просто к сведению: хотя в бесплатной версии доступно множество функций, XML_SaveToFile доступен только в полной (платной) версии.

5

2018-12-04 22:56

Я работал над этим вопросом в течение последних дней, и, хотя могут быть более эффективные решения, я был вполне доволен этим скриптом bash:

По сути, этот скрипт получит файл, сгенерированный из ужасного программного обеспечения bcp, который генерирует неполные и недействительные данные XML, преобразует его из формата UCS-2 в UTF-8 (первая строка) и добавляет в начало и конец файла. что нужно (вторая строка скрипта), чтобы быть действительным и полным.

Меня устраивает. Сценарий, который я использовал для создания файла XML с помощью BCP:

1

2016-08-01 16:26

4 ответа

Лучший ответ

Придется добавить вручную. SQL Server всегда хранит xml внутри как ucs-2, поэтому SQL не может сгенерировать заголовок кодировки utf-8.

См. «Ограничения типа данных xml» в MSDN

37

gbn
25 Янв 2012 в 12:10

Когда я прочитал этот пост, я подумал, что это «конец строки» … нет решения … Я почти отказался от подхода … но на самом деле есть способ обойти это ограничение путем преобразования XML в varchar (max), а затем добавление объявления в начало строки. В следующем сообщении показано, как:

Простой пример будет выглядеть примерно так:

Выход:

6

Community
23 Май 2017 в 12:17

Принятый ответ «добавить вручную», хотя и технически верен, является неполным и, следовательно, вводит в заблуждение. Простое добавление объявления XML с любой «кодировкой», которую вы хотите, не изменяет фактическую кодировку строки. Иногда это нормально. Если вы укажете «UTF-8» и преобразуете данные в , то пока все символы являются стандартными символами ASCII (значения 1–127), Тогда конечно, это UTF-8 (по крайней мере, заметной разницы нет). НО, если есть какие-либо символы со значениями 128 или выше, то у вас нет XML-документа в кодировке UTF-8. А если вы конвертируете XML-данные в , то у вас будет документ в кодировке UTF-16, независимо от того, что вы вручную указываете в декларации XML. Вы должны указывать только кодировку, ЕСЛИ это фактическая кодировка, которая используется.

И до SQL Server 2019 (в настоящее время бета-версия CTP 2.1) не было возможности получить кодировку UTF-8 в SQL Server, по крайней мере, без использования SQLCLR. Но в SQL Server 2019 теперь вы можете преобразовать XML в фактический UTF-8:

Это возвращается:

Поскольку многие люди еще некоторое время не будут использовать SQL Server 2019, это возможно через SQLCLR. Вы можете использовать классы .NET Xml (например, ), чтобы экспортировать это с различными параметрами. Фактически, я создал библиотеку функций SQLCLR, SQL #, которая включает такую ​​функцию: XML_SaveToFile . Функция XML_SaveToFile позволяет указать любую допустимую кодировку, и она установит ее в объявлении XML и обеспечит сохранение файла с этой кодировкой. Он также имеет параметры для отступов, новой строки и т. Д. Просто к сведению: хотя в бесплатной версии доступно множество функций, XML_SaveToFile доступен только в полной (платной) версии.

5

Solomon Rutzky
4 Дек 2018 в 22:56

Я работал над этим вопросом в течение последних дней, и хотя могут быть лучшие решения, я в конечном итоге вполне доволен этим сценарием bash:

По сути, этот скрипт получит файл, сгенерированный ужасным программным обеспечением bcp, которое генерирует неполные и недопустимые данные XML, преобразует его из формата UCS-2 в UTF-8 (первая строка) и добавит в начало и конец файла что ему нужно (вторая строка сценария), чтобы быть действительным и полным.

Меня устраивает. Сценарий, который я использовал для создания XML-файла с помощью BCP:

1

xarlymg89
1 Авг 2016 в 16:26

Универсальный обмен данными XML (с гибкими отборами и сохранением вариантов настроек)

Обработка предназначена для загрузки и выгрузки данных по правилам обмена в любых конфигурациях, реализованных на платформе 1С:Предприятие 8.3. Преимуществом перед типовой обработкой является добавленный функционал:
#1. Установка произвольных фильтров на выгружаемые объекты при помощи механизма системы компоновки данных
#2. Сохранение различных вариантов настроек (сохраняются правила обмена, фильтры выгрузки, параметры, настройки обработки)
— что позволяет гибко настроить в базе-источнике фильтры для выгрузки объектов по различным правилам обмена для различных баз-приемников, сохранить выполненные настройки и в будущем уже пользоваться этими вариантами настроек.
Проверялась на 1С:ERP Управление предприятием 2.4.7.141.

1 стартмани

Создание DTD и ссылки на XML-документ

  1. В Visual Studio 2005 г. или в Visual Studio .NET указать на new в меню File, а затем нажмите файл.

  2. Выберите тип текстового файла и нажмите кнопку Открыть.

  3. Добавьте в файл следующие DTD-декларации, чтобы описать грамматику документа XML:

  4. Сохраните файл как Product.dtd в той же папке, что и XML-документ.

  5. Откройте Product.xml в Visual Studio 2005 г. или в Visual Studio .NET; для этого указать открыть меню File и нажмите кнопку Файл. Добавьте заявление DOCTYPE (ниже строки) следующим образом. Это связывает XML-документ с DTD-файлом.

  6. Сохраните измененный XML-документ вProductWithDTD.xml.

Спецификация в начале XML-файла.

Многие текстовые редакторы автоматически добавляют спецификацию в файл UTF-8.

Примечание Прочитайте следующие статьи:

  • Java добавляет и удаляет спецификацию из файла UTF-8
  • Википедия – Метка порядка байтов (спецификация)

Протестированный с Java 11 и Java 8, встроенный синтаксический анализатор SAX может правильно анализировать файл спецификации UTF-8; однако некоторые разработчики утверждали, что спецификация вызвала ошибку при анализе XML.

Чтобы исправить это , удалите спецификацию из файла UTF-8.

  1. Удалите спецификацию с помощью кода
  2. В notepad++ проверьте кодировку .
  3. В Intellij IDEA прямо в файле выберите .

P.S Многие редакторы текста или кода имеют функции для добавления или удаления метка порядка байтов (спецификация) для файла попробуйте найти нужную функцию в меню.

Альтернативное получение значения из хранилища значения. Свой ХранилищеЗначения.Получить();

Данная публикация не претендует на использование в продакшене, но когда «Нельзя, но очень хочется» в отношении получения ооочень больших данных из ХранилищаЗначения и когда сама платформа не может получить значение и падает, при этом, перед падением съедает почти всю память. Это своего рода костыль, в безвыходной ситуации. Речь пойдет про получение больших данных из хранилища значения в файловых базах на 32-х битной платформе. Данное не касается 64-х битных клиентов/серверов где нет ограничения на размер потребляемой памяти (верней есть, но доступно памяти гораздо больше, чем 32-х битному приложению без PAE).

1 стартмани

Другой формат кодирования

Различная кодировка также вызвала популярный XML

Например, XML-файл UTF-8.

<?xml version="1.0" encoding="utf-8"?>mkyongsupport5000yflowadmin8000

И мы используем кодировку UTF-16 для анализа вышеупомянутого XML-файла в кодировке UTF-8.

  SAXParserFactory factory = SAXParserFactory.newInstance();

  try (InputStream is = getXMLFileAsStream()) {

      SAXParser saxParser = factory.newSAXParser();

      // parse XML and map to object, it works, but not recommend, try JAXB
      MapStaffObjectHandlerSax handler = new MapStaffObjectHandlerSax();

      // more options for configuration
      XMLReader xmlReader = saxParser.getXMLReader();
      xmlReader.setContentHandler(handler);

      InputSource source = new InputSource(is);

      // UTF-16 to parse an UTF-8 XML file
      source.setEncoding(StandardCharsets.UTF_16.toString());
      xmlReader.parse(source);

      // print all
      List result = handler.getResult();
      result.forEach(System.out::println);

  } catch (ParserConfigurationException | SAXException | IOException e) {
      e.printStackTrace();
  }

Выход

 :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1243)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
at com.mkyong.xml.sax.ReadXmlSaxParser2.main(ReadXmlSaxParser2.java:45)

11 ответов

Кодировка в вашем XML и XSD (или DTD) различна.
Заголовок файла XML:
Заголовок файла XSD:

Другой возможный сценарий, который вызывает это, когда что-либо предшествует объявлению типа документа XML. то есть у вас может быть что-то вроде этого в буфере:

или даже пробел или специальный символ.

В буфере могут быть специальные символы, называемые маркерами порядка байтов.
Перед передачей буфера в Parser сделайте это …

Это сообщение об ошибке всегда вызывается недопустимым содержимым XML в начальном элементе. Например, дополнительная маленькая точка «.» В начале элемента XML.

Любые символы перед «» приведут к значению « org.xml.sax.SAXParseException: содержание запрещено в прологе ».

Маленькая точка «. » перед

Чтобы исправить это, просто удалите все эти странные символы перед .

Ссылка: http: //www .mkyong.com /Java /SAX-ошибок контент-это-не-разрешенный-в-пролог /

Я столкнулся с той же проблемой. В моем случае XML-файлы были сгенерированы из программы на c # и переданы в AS400 для дальнейшей обработки. После некоторого анализа выяснилось, что я использовал кодировку UTF8 при создании файлов XML, тогда как javac (в AS400) использует «UTF8 без BOM».
Итак, пришлось написать дополнительный код, подобный указанному ниже:

Удаление объявления xml решило проблему

В моем xml-файле заголовок выглядел так:

В тестовом файле я читал байты файла и декодировал данные как UTF-8 (не понимая, что заголовок в этом файле был utf-16) для создания строки.

Когда я попытался десериализовать эту строку в объект, я увидел ту же ошибку:

Когда я обновил вторую строку до

Мне удалось десериализовать объект просто отлично. Итак, как заметил Ромен выше, кодировки должны совпадать.

Я столкнулся с той же проблемой под названием «Содержимое запрещено в прологе» в моем XML-файле.

Решение

Изначально моей корневой папкой было «# Имя файла ».

Когда я удалил первый символ ‘#’, ошибка была устранена.

Нет необходимости удалять #filename …
Попробуйте таким образом.

Вместо передачи объекта File или URL-адресу методу unmarshaller используйте FileInputStream.

У меня была проблема при проверке xml-файла в notepad ++ и сохранении файла, хотя у меня был верхний xml-тег utf-8 как

Исправлено путем сохранения файла в notpad ++ с помощью Encoding (Tab)> Кодировать в UTF-8: выбрано (было Кодировать в UTF-8-BOM)

У меня был символ табуляции вместо пробелов.
Замена вкладки ‘\ t’ устранила проблему.

Вырежьте и вставьте весь документ в редактор, например Notepad ++, и отобразите все символы.

В моем случае проблема была в том, чтобы заменить немецкие умлауты (äöü) их HTML-эквивалентами …

ниже приведены причины выше исключения «org.xml.sax.SAXParseException: содержимое запрещено в прологе».

  1. Сначала проверьте путь к файлу schema.xsd и file.xml.
  2. Кодировка в XML и XSD (или DTD) должна быть одинаковой.
    Заголовок файла XML:
    Заголовок файла XSD:
  3. если что-то предшествует объявлению типа документа XML.i.e:

В духе «просто удалите все эти странные символы перед <? xml», вот мой Java-код, который хорошо работает с вводом через BufferedReader:

FWIW, байты, которые я видел (в десятичном виде): 239, 187, 191.

Еще один взгляд на проблему «жизнь без последовательностей». Часть вторая (практическая) Промо

В [1 — http://infostart.ru/public/62938/] был предложен метод корректировки списаний по партиям при изменении документов задним числом. Использование данного метода позволяет контролировать остатки при неоперативном проведении и поддерживать учет по партиям всегда в актуальном состоянии, то есть обходиться без механизма последовательности документов. Собственно метод заключался в решении задачи правильного списания по партиям как задачи линейного программирования.

В доказательство работоспособности метода приводится следующая «каркасная» конфигурация «Полигон», в которой этот метод реализован.

1 стартмани

Вступление

Статья рассматривает преобразование XML в XHTML посредством XSLT на клиенте средствами JavaScript. К примеру, у вас есть какие-либо данные в виде XML, а вам требуется по какому-либо действию клиента (по клику на ссылке), оформить их в HTML и динамически вставить в страницу. Это не так сложно, но по пути, как оказалось, встречается несколько подводных камней — в основном, относительно кросс-браузерности этого подхода и малой освещённости процесса в сети. Генерация XHTML-страниц средствами браузера (прямой запрос на XML файл, содержащий информацию о стиле) — это другая тема, она намного проще, и здесь затронута не будет.

Задача будет рассмотрена на банальном примере личного сайта. Дано: Файл с контактными данными (XML), некая главная страница (XHTML) и пять браузеров: Firefox 3, Opera 9.5, IE7, Safari 3, Google Chrome. На главной странице есть ссылка, при нажатии которой контактные данные преобразуются в несортированный список (UL) и отображаются в специально выделенной области прямо на этой странице. Это реальный рабочий пример, который я сейчас использую для создания своего сайта (ещё не выложенного).

1С+Классы. Версия-0

Разработано ООП-расширение языка 1С, включающее (но не ограничивающееся):
Классы как абстрактные типы данных с элементами «переменная», «свойство», «функция», «процедура»; Интерфейсы как абстрактные классы без элементов состояния («переменная») и без привязки к реализации методов (свойств, процедур, функций) при определении; Имплементация (реализация) интерфейсов классами;
— одиночное открытое наследование; Области видимости «внутренняя» (private), «экспорт» (public), «защищенная» (protected); Статические элементы классов (общие для всех экземпляров класса); Замещение (переопределение реализации) методов при наследовании – «виртуальные методы, свойства»; Сокрытие (затенение) обычных (не замещаемых) элементов при наследовании; Перегрузка процедур и функций по количеству и типам данных аргументов; Конструкторы класса; Деструктор класса; Слабые ссылки; Делегаты.

1 стартмани

Выгрузка и загрузка XML для управляемых форм 8.3 (с отбором)

В работе постоянно приходится разделять в различные базы или объединять несколько организаций в одну базу, долгое время пользовался стандартной обработкой выгрузка-загрузка из UNIREPS 8.2, в режиме обычного приложения, но, к сожалению, для управляемого приложения стандартная обработка из UNIREPS 8.3 (Диск ИТС) не позволяет нормально сделать выгрузку с отбором, поэтому ей никогда не воспользовался. Решил что напишу обработку, которая позволит делать отборы в различных вариациях, кроме того, в обработках из UNIREPS (8.2 и 8.3) существенно отличается процесс загрузки предопределенных, что не всегда удобно при больших объемах данных. Обработка написана на базе UNIREPS 8.3, но есть существенные изменения.
Но интерфейс доработан так, чтобы обработка была похожа на старую добрую обработку из UNIREPS 8.2, к которой все так привыкли.

1 стартмани

XML

Контактные данные, при их большом количестве, можно сгруппировать, поэтому XML-схема построена с учётом группировки элементов. Группа имеет краткое имя (shortname) для создания id у списка (возможно, потребуется оформить каждую группу по-особому) и, собственно, имя группы. XML-файл может содержать contact-ноды и вне групп, но в данном примере в этом нет необходимости. Все контакты имеют тип (type) для создания корректных ссылок в будущем (это мы также опустим). С остальным, вроде бы, всё понятно:

Структура довольно-таки проста, поэтому приведу сразу пример файла (любое сходство с реальными данными какого-либо индивидуума полностью случайно и приведено не намеренно):

<?xmlversion="1.0"encoding="UTF-8"?><?xml-stylesheettype="text/xsl"href="./contacts.xsl"?><contactsxmlns="http://any-developer.name"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://any-developer.name ./contacts.xsd"><groupshortname="messengers"><name>Messengers</name><contacttype="skype"><id>any.developer</id></contact><contacttype="jabber"><id>[email protected]</id><name>ulric.wilfred</name></contact><contacttype="gtalk"><id>any.developer</id></contact><contacttype="yahoo"><id>any.developer</id></contact><contacttype="icq"><id>7484939304033345544</id><name>any.developer</name></contact></group><groupshortname="email"><name>E-Mail</name><contacttype="gmail"><id>any.developer</id></contact><contacttype="yahoo-mail"><id>any.developer</id></contact></group></contacts>

Итог

Всё, весь необходимый код готов и вы можете использовать функцию getStylingResult для преобразования XML-файлов и вставки результата в XHTML. Например, таким образом:

document.getElementById('content').innerHTML = 
                getStylingResult('./contacts.xml', './contacts.xsl');

Как итог, мы получили действительно кросс-браузерную версию обработки XML на клиенте

Спасибо за внимание

P.S. Для того, чтобы иметь возможность передавать параметры XSL-шаблону через метод addParameter, в качестве документа XSL нужно использовать экземпляр Msxml2.FreeThreadedDOMDocument.3.0, а не обычный Microsoft.XMLDOM. Если вам это необходимо, обратитесь к данной статье (вам потребуется перегрузить функцию loadXML из моего примера).

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: