2013-10-12 2 views
1

У меня есть XML-файл, который должен читать SAX-парсер, хранить в CSV и импортировать в базу данных.Чтение как числовых кодов вместо специальных символов

В моем файле XML, есть Автор с именем: <author>G&uuml;nther Heinemann</author> Как вы можете увидеть «ü» в XML записывается в виде &umml;.

SO да Мне нужно сохранить автора в базе данных. Я не могу сохранить этот символ как «ü». Мне нужно хранить его как &umml;

Но когда я использую SAX парсер для чтения из XML, то продолжайте читать, как «ü» вместо &umml; Как я могу сделать Java магазин, как &umml; и не «ü»?

Спасибо

+0

возможно дубликат [SAX парсера: Игнорирование специальных символов] (http://stackoverflow.com/questions/5475202/sax-parser-ignoring-special-characters) – lkuty

ответ

0

Это, вероятно, медленно тоже, скорее всего, огромный HTML DTD с включает в себя чтение. Однако вам это нужно, поскольку один амперсанд (&) не допускается. Этот DTD HTML определяет сотни имен объектов HTML, таких как &perc; (%).

DTD может быть взято из каталога XML, что является автономной локальной версией для этого HTML-адреса. Затем вы можете изменить сущности. Но это слишком много работы.

Что можно сделать, это установить свой собственный EntityHandler в парсер и так далее. Научно-исследовательская работа относительно проста.

Проще всего было бы обернуть ввод в свой собственный InputStream/Reader, скажем, BufferedReader, заменив & на &amp;, что сделало бы необходимые замены.

В XML: &amp;uuml; вместо &uuml;.

line = line.replace("&", "&amp;"); 
// Undo XML escapes: 
String[] xmlTags = { "amp", "lt", "gt", "quot", "apos" }; 
for (String xmlTag : xmlTags) { 
    line = line.replace("&amp;" + xmlTag + ";", "&" + xmlTag + ";"); 
} 
0

Использование Apache Commons Lang «s StringEscapeUtils методы полезности escapeHtml() и unescapeHtml()

String plain = StringEscapeUtils.unescapeHtml(htmlSafe); 

String htmlSafe = StringEscapeUtils.escapeHtml(plain); 
+0

Не 'unescapeXml()' делает противоположное тому, что просит OP? Я бы попробовал [escapeHtml()] (http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#escapeHtml%28java.lang.String% 29). – mzjn

+0

@mzjn Я неправильно понял вопрос. Приветствия. – Bohemian

+0

Я сам этого не пробовал, но, согласно документации, 'escapeXml()' и 'unescapeXml()' поддерживает только пять встроенных объектов XML. Чтобы превратить 'ü' в' ü ', кажется, вам придется использовать' escapeHtml() '. – mzjn

0

Вы можете использовать модифицированную версию коды ниже, перехватывает начало и конец сущностей. Выполнение занимает несколько секунд, поскольку анализатор должен извлекать объявления всех объектов latin1 HTML. Когда вы получаете объект, который не начинается с %, вы можете сделать замену вставленного символа в буфере acc. Обратите внимание на предопределенные объекты, такие как &amp;.

Вы также можете использовать фильтр Sax для задания автоматически. ЧФР. ответ https://stackoverflow.com/a/5524862/452614. Я могу обновить свой ответ, чтобы предоставить полное решение. выполнение

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.*; 
import org.xml.sax.ext.DefaultHandler2; 

class MyHandler extends DefaultHandler2 { 

    private StringBuilder acc; 

    public MyHandler() { 
     acc = new StringBuilder(); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes atts) throws SAXException { 
     System.out.printf("startElement. uri:%s, localName:%s, qName:%s\n", uri,  localName, qName); 
     acc.setLength(0); 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     System.out.printf("endElement. uri:%s, localName:%s, qName:%s\n", uri,  localName, qName); 
     System.out.printf("Characters accumulated: %s\n", acc.toString()); 
     acc.setLength(0); 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     acc.append(ch, start, length); 
     System.out.printf("characters. [%s]\n", new String(ch, start, length)); 
    } 

    @Override 
    public void startEntity(java.lang.String name) 
      throws SAXException { 
     System.out.printf("startEntity: %s\n", name); 
    } 

    @Override 
    public void endEntity(java.lang.String name) 
      throws SAXException { 
     System.out.printf("endEntity: %s\n", name); 
    } 
} 

public class SAXTest1 { 

    public static void main(String args[]) throws SAXException,  ParserConfigurationException, UnsupportedEncodingException { 
     String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE author [\n< !ELEMENT author (#PCDATA)>\n<!ENTITY % HTMLlat1 PUBLIC \"-//W3C//ENTITIES  Latin 1 for XHTML//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\"> \n%HTMLlat1;\n]>\n<author>G&uuml;nther Heinemann</author>"; 
     System.out.println(s); 
     InputStream stream = new ByteArrayInputStream(s.getBytes("UTF-8")); 

     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setValidating(true); 
     XMLReader xmlReader = factory.newSAXParser().getXMLReader(); 

     DefaultHandler2 handler = new MyHandler(); 
     xmlReader.setContentHandler(handler); 
     xmlReader.setProperty(
       "http://xml.org/sax/properties/lexical-handler", 
       handler); 

     try { 
      xmlReader.parse(new InputSource(stream)); 
     } catch (IOException e) { 
      System.err.println("I/O error: " + e.getMessage()); 
     } catch (SAXException e) { 
      System.err.println("Parsing error: " + e.getMessage()); 
     } 
    } 
} 

Программа:

$ java SAXTest1 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE author [ 
<!ELEMENT author (#PCDATA)> 
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml-lat1.ent"> 
%HTMLlat1; 
]> 
<author>G&uuml;nther Heinemann</author> 
startEntity: %HTMLlat1 
endEntity: %HTMLlat1 
startElement. uri:, localName:, qName:author 
characters. [G] 
startEntity: uuml 
endEntity: uuml 
characters. [ünther Heinemann] 
endElement. uri:, localName:, qName:author 
Characters accumulated: Günther Heinemann 
Смежные вопросы