2013-10-12 4 views
1

SAX 파서에서 읽을 XML 파일이 있으며 CSV에 저장하고 데이터베이스로 가져올 수 있습니다. 당신이 &umml;으로 작성 XML에서 "ü"를 볼 수 있듯이 <author>G&uuml;nther Heinemann</author> : 내 XML 파일에서특수 문자 대신 숫자 코드로 읽기

는 이름을 가진 저자가있다.

그렇습니다. 예 작성자를 데이터베이스에 저장해야합니다. 그 캐릭터를 "ü"로 저장할 수 없습니다. 대신 &umml; 가 어떻게 &umml; 아니라 "ü"자바 저장을 할 수 있습니다 나는 &umml;

로 저장해야하지만 XML에서 읽을 SAX 파서를 사용하는 경우, 그것은 "ü"로 계속 읽어?

은 읽어 포함와 같은 가능성이 큰 HTML DTD, 그것은 아마 너무 느립니다 당신에게

+0

의 중복 가능성 [SAX 파서 : 특수 문자를 무시 (http://stackoverflow.com/questions/5475202/sax-parser-ignoring-special-characters) – lkuty

답변

0

감사드립니다. 그러나 하나의 앰퍼샌드 (&)는 허용되지 않으므로 필요합니다. 이 HTML DTD는 &perc; (%)과 같은 수백 개의 HTML 엔터티 이름을 정의합니다.

DTD는 XML 카탈로그에서 가져올 수 있습니다. 해당 HTML URL의 오프라인 로컬 버전은 무엇입니까? 그런 다음 엔터티를 변경할 수 있습니다. 하지만 너무 많은 작업입니다.

당신이 할 수있는 일은 자신의 EntityHandler을 파서 등에 설치하는 것입니다. 상대적으로 쉬운 연구 작업.

가장 쉬운 방법은 입력 버퍼를 &으로 바꾸고 BufferedReader를 &amp;으로 바꾸는 것입니다. 그러면 필요한 대체 작업을 수행 할 수 있습니다.

&uuml; 대신 XML : &amp;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 LangStringEscapeUtils 유틸리티 메소드 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)을 시도 할 것이다.문자열 % 29). – mzjn

+0

@mzjn 질문을 잘못 읽었습니다. 건배. – Bohemian

+0

필자는 실제로 이것을 시도하지는 않았지만 문서에 따르면'escapeXml()'과'unescapeXml()'은 5 개의 내장 XML 엔티티 만 지원합니다. 'ü '를'ü'으로 바꾸려면'escapeHtml()'을 사용해야 할 것 같습니다. – mzjn

0

당신은 코드의 수정 된 버전을 사용할 수 있습니다. 파서가 모든 HTML latin1 엔티티의 선언을 가져와야하기 때문에 몇 초 정도 걸립니다. %으로 시작하지 않는 엔티티를 가져 오면 acc 버퍼에 삽입 된 문자를 대체 할 수 있습니다. &amp;과 같은 미리 정의 된 항목에주의하십시오.

작업에 자동으로 Sax 필터를 사용할 수도 있습니다. Cfr. 대답 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 
관련 문제