Java: игнорирование escape-символов при разборе XML - PullRequest
4 голосов
/ 13 апреля 2010

Я использую DocumentBuilder для разбора файлов XML. Однако спецификация для проекта требует, чтобы в текстовых узлах строки типа &quot; и &lt; возвращались буквально, а , а не , декодировались как символы (" и <).

Предыдущий аналогичный вопрос, Считать экранированную цитату как экранированную цитату из xml , получил один ответ, который, похоже, специфичен для Apache, и другой, который, похоже, просто не выполняет то, что говорит. Тем не менее, я бы хотел оказаться неправым в любом случае:)

Для справки приведем код:

  file = new File(fileName);
  DocBderFac = DocumentBuilderFactory.newInstance();
  DocBder = DocBderFac.newDocumentBuilder();
  doc = DocBder.parse(file);

  NodeList textElmntLst = doc.getElementsByTagName(text);
  Element textElmnt = (Element) textElmntLst.item(0);

  NodeList txts = textElmnt.getChildNodes(); 
  String txt = ((Node) txts.item(0)).getNodeValue();
  System.out.println(txt);

Я бы хотел, чтобы println () создавал такие вещи, как

&quot;3&gt;2&quot;

вместо

"3>2"

что сейчас и происходит. Спасибо!

Ответы [ 4 ]

3 голосов
/ 13 апреля 2010

Вы можете превратить их обратно в xml-кодированную форму с помощью

 StringEscapeUtils.escapeXml(str);

( javadoc , commons-lang )

2 голосов
/ 13 апреля 2010

Я использую DocumentBuilder для разбора файлов XML. Однако спецификация для проекта требует, чтобы в текстовых узлах строки типа &quot; и &lt; возвращались буквально, а не декодировались как символы ("и <). </p>

Плохое требование. Не делай этого.

Или, по крайней мере, тщательно обдумайте, почему вы считаете, что хотите или нуждаетесь в этом.

Разделы и экранирование CDATA - это тактика, позволяющая передавать текст, такой как кавычки и символы «<», через XML, а XML не путать их с разметкой. Они сами по себе не имеют никакого значения, и когда вы извлекаете их из XML, вы должны принять их как кавычки и символы «<», которые они должны были представлять. </p>

1 голос
/ 13 апреля 2010

Одним из подходов может быть попытка dom4j и использование метода Node.asXML () . Он может вернуть глубокую структуру, поэтому может потребоваться клонирование, чтобы получить только нужный вам узел или текст без дочерних элементов.

0 голосов
/ 13 апреля 2010

Оба хороших ответа, но оба слишком тяжелые для этого очень мелкого приложения. Я закончил тем, что ушел с полным взломом всего лишь удаления всех & s (я делаю это с & s, которые позже не являются частью побегов). Это некрасиво, но работает.

Редактировать: Я понимаю, что в этом есть что-то не так, и это требование глупо. Это для школьного проекта, все, что имеет значение, это то, что он работает в одном случае, и требование не моя вина:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...