2015-02-19 6 views
0

У меня есть класс Java Java. Метод buildDocument() принимает строку XML и возвращает org.w3c.dom.Document. Конкретный XML, который я передаю ему, - это документ xhtml 1.1.Объекты символов HTML, разделенные при создании org.w3c.dom.Document

Вопрос в том, если есть HTML названные объекты, как,

<p>Preserve dagger &dagger;</p> 

выход,

<p>Preserve dagger </p> 

Это сохранение &lt;, &gt;, &amp;, &quot;.

Это класс, создающий Document.

package com.example; 

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.StringWriter; 
import java.nio.charset.StandardCharsets; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 

public final class XMLUtils { 

    private XMLUtils() { 
    } 

    public static Document buildDocument(String xml) throws ParserConfigurationException, SAXException, IOException { 

     DocumentBuilderFactory domFactory = DocumentBuilderFactory 
      .newInstance(); 
     domFactory.setNamespaceAware(true); 

     domFactory.setFeature("http://xml.org/sax/features/validation", false); 
     domFactory.setFeature(
      "http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
     domFactory.setFeature(
      "http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
     domFactory.setCoalescing(false); 
     DocumentBuilder builder = domFactory.newDocumentBuilder(); 

     Document doc = builder.parse(new ByteArrayInputStream(
       xml.getBytes(StandardCharsets.UTF_8))); 

     try { 
      DOMSource domSource = new DOMSource(doc); 
      StringWriter writer = new StringWriter(); 
      StreamResult result = new StreamResult(writer); 
      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer transformer = tf.newTransformer(); 
      transformer.transform(domSource, result); 
      System.out.println("XML OUT: \n" + writer.toString()); 
     } catch (Exception ex) { 

     } 

     return doc; 
    } 
} 

Я думаю, что это соответствующие зависимости.

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>Saxon-HE</artifactId> 
    <version>9.5.1-6</version> 
</dependency> 
<dependency> 
    <groupId>xerces</groupId> 
    <artifactId>xercesImpl</artifactId> 
    <version>2.11.0</version> 
    <type>jar</type> 
</dependency> 
<dependency> 
    <groupId>xml-resolver</groupId> 
    <artifactId>xml-resolver</artifactId> 
    <version>1.2</version> 
    <type>jar</type> 
</dependency> 

Любые идеи о том, как сохранить эти сущности? Спасибо,/w

+0

посмотрите на это http://stackoverflow.com/questions/4095451/java-xml-processing-entity-problem – Naren

+0

@Naren Я прочитал этот вопрос, и я не уверен, что он применим к этой ситуации. У меня проверка DTD отключена. Он надеялся пройти через все сущности. Я смотрел в Entity Resolver - просто не уверен, как его реализовать, или если он решит эту проблему. – wsams

+0

Когда я устанавливаю распознаватель сущности, метод 'resolveEntity (publicId, systemId)' никогда не вызывается. Я пытаюсь включить загрузку dtd, но для исправления других каскадных исключений. – wsams

ответ

0

Мне понадобилось некоторое время, чтобы найти решение этой проблемы, по-видимому, трудно найти правильные ключевые слова ... так как я нашел этот до, найдя лучший ответ, я подумал, что это стоит связать его здесь, даже если он находится на StackOverflow в любом случае. Вот вы: Keep numeric character entity characters such as `&#10; &#13;` when parsing XML in Java

Это не совсем удовлетворительно, но, по крайней мере, это очень хорошо объясняет, почему нет лучшего решения.

Смежные вопросы