Преобразовать строку в w3c.dom.Element: исключение XMLParseException: ожидается начало корневого элемента

#java #xml

#java #xml

Вопрос:

Я нашел следующий фрагмент кода из блога, при его запуске я получаю исключение

Исключение XMLParseException: ожидается начало корневого элемента. на 9-й строке.

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

 String s = "Hello DOM Parser";
java.io.InputStream sbis = new java.io.StringBufferInputStream(s);
javax.xml.parsers.DocumentBuilderFactory b = javax.xml.parsers.DocumentBuilderFactory.newInstance();
b.setNamespaceAware(false);
org.w3c.dom.Document doc = null;
javax.xml.parsers.DocumentBuilder db = null;
db = b.newDocumentBuilder();
doc = db.parse(sbis);     

org.w3c.dom.Element e = doc.getDocumentElement();
  

Комментарии:

1. "Hello DOM Parser" это не XML.

2. @skaffman — есть вероятность, что исходный текст содержал теги элементов, но эти теги были удалены в процессе копирования / вставки текста между веб-приложениями… но в любом случае, исходное сообщение, как я вижу, не содержало элементов тега в String s объявлении.

3. @Abhishek, я предполагаю, что вы сослались на мой пост в блоге, основываясь на фрагменте кода и выданном исключении, поскольку строка на самом деле не является представлением элемента xml. Увидев это, я обновил свой пост в блоге , чтобы избежать каких-либо осложнений.

Ответ №1:

Чтобы создать DOM Element с пользовательским тегом (который, я полагаю, вам нужен, но не могу быть уверен), вы можете использовать следующий подход:

 String customTag = "HelloDOMParser";

Document doc = documentBuilder.newDocument();       

String fullName = nameSpacePrefix   ":"   customTag;

Element customElement = document.createElementNS(namespaceUri, fullName);

doc.appendChild(customElement);
  

Я предполагаю, что вы знаете URI пространства имен и свой префикс (если таковой имеется). Если вы не используете пространства имен, просто используйте createElement() метод вместо этого.

Ответ №2:

Как сказано в комментарии, «Hello DOM Parser» не является элементом XML. И поэтому анализатор не знает, что с этим делать. Я не знаю, какой документ вы создаете, но если вам нужен HTML, вы можете встроить текст в html-тег, например;

 <div>Hello DOM Parser</div>
<span>Hello DOM Parser</span>
  

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

 <mytag>Hello DOM Parser</mytag>
  

Некоторые пояснения по DOM;
http://www.w3.org/DOM

Чтобы ответить на ваш вопрос, для преобразования строки в элемент w3c вы можете использовать createElement;

 Element hello = document.createElement("hello");          
hello.appendChild(document.createTextNode("Hello DOM Parser"));
  

Это приводит к;

 <hello>Hello DOM Parser</hello>
  

Комментарии:

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

Ответ №3:

Метод parse DocumentBuilder принимает входной поток, который содержит содержимое xml. Следующее изменение будет работать для вас:

 String s = "<?xml version="1.0" encoding="UTF-8"?>n<root><elem1>Java</elem1></root>";
  

Старайтесь избегать использования устаревших классов, таких как StringBufferInputStream. Вы можете обратиться к документу ниже, чтобы узнать больше о синтаксическом анализе Java XML.

http://www.java-samples.com/showtutorial.php?tutorialid=152