java xpath와dom4j로 xml 해석
일반적으로 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GAS(Google Apps Script)에서 정기적으로 값을 기록하는 프로그램을 만들어 보았습니다.Google 스프레드시트에서 특정 사이트의 특정 값을 XPath로 추출한 다음 해당 값을 GAS(Google Apps Script)로 정기적으로(1시간 동안) Google 스프레드시트의 별도 시트에 기록합니다. 가는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.