java xpath와dom4j로 xml 해석

12045 단어 xpathdom4jxml
1 XML 파일 해석의 4가지 방법
일반적으로 XML 파일을 분석하는 데는 네 가지 고전적인 방법이 있다.기본적인 해석 방식은 두 가지가 있는데 하나는 SAX이고 다른 하나는 DOM이다.SAX는 이벤트 흐름 기반, DOM은 XML 문서 트리 구조 기반입니다.이를 바탕으로 DOM, SAX의 인코딩량을 줄이기 위해 JDOM이 등장했는데 20-80원칙(파르토리아 법칙)으로 코드량을 크게 줄였다는 장점이 있다.일반적인 상황에서 JDOM은 해석, 창설 등 실현해야 할 기능을 간단하게 충족시킬 수 있다.그러나 하단에서 JDOM은 SAX, DOM, Xanan 문서를 사용합니다.또 하나는 DOM4J로 매우 우수한 자바 XML API로 성능이 우수하고 기능이 강하며 사용하기 쉬운 특징을 가지며 오픈 소스 코드의 소프트웨어이기도 하다.오늘날 점점 더 많은 자바 소프트웨어들이 DOM4J를 사용하여 XML을 읽고 쓰는 것을 볼 수 있다. 특히 태양의 JAXM마저도 DOM4J를 사용하고 있다.구체적인 네 가지 방법의 사용은 바이두에서 한 번 보면 매우 많은 상세한 소개가 있을 것이다.
2 XPath 간단한 소개
XPath는 XML 문서에서 정보를 찾는 언어입니다.XPath는 XML 문서에서 요소와 속성을 탐색하고 요소와 속성을 훑어보는 데 사용됩니다.XPath는 W3C XSLT 표준의 주요 요소이며 XQuery와 XPointer는 XPath 표현 위에 구축됩니다.따라서 XPath에 대한 이해는 많은 고급 XML 응용 프로그램의 기초이다.XPath는 데이터베이스에서 작업하는 SQL 언어나 JQuery와 유사하여 개발자가 문서에 필요한 물건을 쉽게 잡을 수 있습니다.또한 DOM4J는 XPath 사용을 지원합니다.
3 DOM4J XPath 사용
DOM4J가 XPath를 사용하여 XML 문서를 분석하려면 먼저 프로젝트에서 두 개의 JAR 패키지를 참조해야 합니다.
dom4j-1.6.1.jar: DOM4J 패키지, 다운로드 주소http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar: 보통 이 패키지를 추가하지 않으면 이상이 발생합니다(java.lang.NoClassDefFoundError: org/jaxen/JaxenException), 다운로드 주소http://www.jaxen.org/releases.html.
3.1 네임스페이스(namespace)의 방해
excel 파일이나 다른 형식의 파일로 변환된 xml 파일을 처리할 때 XPath 해석을 통해 결과를 얻지 못하는 경우가 많습니다.이런 상황은 통상적으로 명명 공간의 존재로 인한 것이다.다음 XML 파일을 예로 들면 XPath = "//Workbook/Worksheet/Table/Row[1]/Cell[1]/Data[1]"를 통해 간단한 검색을 하는데 일반적으로 결과가 나오지 않습니다.이것이 바로 명명공간namespace(xmlns='urn:schemas-microsoft-com:office:spreadsheet')로 인한 것이다.

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
  <Worksheet ss:Name="Sheet1">
    <Table ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
      <Row ss:AutoFitHeight="0">
  <Cell>
   <Data ss:Type="String"> </Data>
  </Cell>
      </Row>
      <Row ss:AutoFitHeight="0">
  <Cell>
   <Data ss:Type="String">Sunny</Data>
  </Cell>
      </Row>
    </Table>
  </Worksheet>
</Workbook>
3.2 이름공간이 있는 xml 파일에 대한 XPath 분석
첫 번째 방법 (read1 () 함수): XPath 문법에 있는 local-name () 과namespace-uri () 를 사용하여 사용할 노드 이름과 이름 공간을 지정합니다.XPath 표현식 쓰기는 번거롭습니다.
두 번째 방법(read2() 함수): XPath의 이름 공간을 설정하고 setNamespaceURIs() 함수를 사용합니다.
세 번째 방법(read3() 함수): DocumentFactory()의 네임스페이스를 설정하고 setXPathNamespaceURIs() 함수를 사용합니다.XPath 표현식 쓰기는 2-3 두 가지 방법으로 간단합니다.
네 번째 방법(read4() 함수): 방법은 세 번째 방법과 같지만 XPath 표현식이 다르다(프로그램이 구체적으로 나타난다). 주로 XPath 표현식이 다르다는 것을 검증하기 위해 완전한 정도를 가리키며 검색 효율에 영향을 미치는지 여부를 가리킨다.
(이 네 가지 방법은 모두 DOM4J와 XPath를 결합하여 XML 파일을 분석함)
다섯 번째 방법(read5() 함수): DOM과 XPath를 결합하여 XML 파일을 분석하는데 주로 성능 차이를 검증하기 위한 것이다.
코드보다 더 문제를 설명할 수 있는 것은 없다!과감하게 코드를 올려라!

packageXPath;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;

importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.xpath.XPathConstants;
importjavax.xml.xpath.XPathExpression;
importjavax.xml.xpath.XPathExpressionException;
importjavax.xml.xpath.XPathFactory;

importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.Element;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;

/**
*DOM4JDOMXMLXPath
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
read1();
read2();
read3();
read4();//read3() , XPath
read5();
}

publicstaticvoidread1(){
/*
*uselocal-name()andnamespace-uri()inXPath
*/
try{
longstartTime=System.currentTimeMillis();
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath\\XXX.xml");
Documentdoc=reader.read(in);
/*Stringxpath="//*[local-name()='Workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[local-name()='Worksheet']"
+"/*[local-name()='Table']"
+"/*[local-name()='Row'][4]"
+"/*[local-name()='Cell'][3]"
+"/*[local-name()='Data'][1]";*/
Stringxpath="//*[local-name()='Row'][4]/*[local-name()='Cell'][3]/*[local-name()='Data'][1]";
System.err.println("=====uselocal-name()andnamespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("unchecked")
List<Element>list=doc.selectNodes(xpath);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println(" :"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}

publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURIs)
*/
try{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath\\XXX.xml");
Documentdoc=reader.read(in);
Stringxpath="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("=====usesetNamespaceURIs()tosetxpathnamespace====");
System.err.println("XPath:"+xpath);
XPathx=doc.createXPath(xpath);
x.setNamespaceURIs(map);
@SuppressWarnings("unchecked")
List<Element>list=x.selectNodes(doc);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println(" :"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}

publicstaticvoidread3(){
/*
*setDocumentFactory()namespace(setXPathNamespaceURIs)
*/
try{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath\\XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(map);
Documentdoc=reader.read(in);
Stringxpath="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("=====usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("unchecked")
List<Element>list=doc.selectNodes(xpath);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println(" :"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}

publicstaticvoidread4(){
/*
* read3() , XPath
*/
try{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath\\XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(map);
Documentdoc=reader.read(in);
Stringxpath="//Workbook:Worksheet/Workbook:Table/Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("=====usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("unchecked")
List<Element>list=doc.selectNodes(xpath);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println(" :"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}

publicstaticvoidread5(){
/*
*DOMandXPath
*/
try{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
DocumentBuilderbuilder=dbf.newDocumentBuilder();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath\\XXX.xml");
org.w3c.dom.Documentdoc=builder.parse(in);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=factory.newXPath();
// class name
Stringxpath="//Workbook/Worksheet/Table/Row[4]/Cell[3]/Data[1]";
System.err.println("=====DomXPath====");
System.err.println("XPath:"+xpath);
XPathExpressionexpr=x.compile(xpath);
NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODE);
for(inti=0;i<nodes.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println(" :"+(endTime-startTime)+"ms");
}
}catch(XPathExpressionExceptione){
e.printStackTrace();
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}

PS: 여기에 xml 작업에 대한 온라인 도구를 몇 가지 더 제공하여 참고하여 사용할 수 있습니다.
온라인 XML/JSON 상호 변환 도구:
http://tools.jb51.net/code/xmljson
온라인 포맷 XML/온라인 압축 XML:
http://tools.jb51.net/code/xmlformat
XML 온라인 압축/포맷 도구:
http://tools.jb51.net/code/xml_format_compress

좋은 웹페이지 즐겨찾기