1 XML 파일을 구문 분석하는 4가지 방법
XML 파일을 구문 분석하는 데는 네 가지 일반적인 방법이 있습니다. 두 가지 기본 구문 분석 방법이 있는데, 하나는 SAX라고 하고 다른 하나는 DOM이라고 합니다. SAX는 이벤트 스트림 구문 분석을 기반으로 하고 DOM은 XML 문서 트리 구조 구문 분석을 기반으로 합니다. 이를 바탕으로 DOM과 SAX의 코딩량을 줄이기 위해 JDOM은 20-80 원칙(파레토 원칙)을 적용해 코드량을 대폭 줄이는 장점이 등장했다. 일반적인 상황에서는 JDOM을 사용하여 구문 분석, 생성 등 구현해야 할 간단한 기능을 충족합니다. 그러나 최하위 수준에서 JDOM은 여전히 SAX(가장 일반적으로 사용됨), DOM 및 Xanan 문서를 사용합니다. 다른 하나는 뛰어난 성능, 강력한 기능 및 극도의 사용 편의성을 갖춘 매우 뛰어난 Java XML API인 DOM4J입니다. 요즘에는 점점 더 많은 Java 소프트웨어가 DOM4J를 사용하여 XML을 읽고 쓰는 것을 볼 수 있습니다. 특히 Sun의 JAXM도 DOM4J를 사용하고 있다는 점은 언급할 가치가 있습니다. 네 가지 방법의 구체적인 사용법에 대해서는 Baidu를 검색하면 자세한 소개가 많이 나올 것입니다.
2 XPath에 대한 간략한 소개
XPath는 XML 문서에서 정보를 찾는 언어입니다. XPath는 XML 문서의 요소와 속성을 탐색하고 요소와 속성을 탐색하는 데 사용됩니다. XPath는 W3C XSLT 표준의 주요 요소이며 XQuery와 XPointer는 모두 XPath 표현식을 기반으로 구축되었습니다. 따라서 XPath에 대한 이해는 많은 고급 XML 애플리케이션의 기초가 됩니다. XPath는 데이터베이스 작업을 위한 SQL 언어 또는 JQuery와 매우 유사하므로 개발자가 문서에서 필요한 내용을 쉽게 파악할 수 있습니다. DOM4J는 XPath 사용도 지원합니다.
3 XPath를 사용하는 DOM4J
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 네임스페이스의 간섭
Excel 파일이나 기타 형식의 파일에서 변환된 xml 파일을 처리할 때 XPath 구문 분석을 통해 결과를 얻을 수 없는 상황이 종종 발생합니다. 이 상황은 일반적으로 네임스페이스의 존재로 인해 발생합니다. 다음 내용의 XML 파일을 예로 들어 XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] "을 통해 단순 검색을 수행하면 일반적으로 결과가 없습니다. 나타나다. 이는 네임스페이스(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">
<워크시트 ss:이름="시트1">
<테이블 ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<행 ss:AutoFitHeight="0">
<셀>
<Data ss:Type="String">코드를 입력하는 쥐</Data>
</Cell>
</행>
<행 ss:AutoFitHeight="0">
<셀>
<Data ss:Type="String">맑음</Data>
</Cell>
</행>
</테이블>
</워크시트>
</워크북>
3.2 네임스페이스를 사용하여 XPath 구문 분석 XML 파일
첫 번째 방법(read1() 함수): XPath 구문과 함께 제공되는 local-name() 및 네임스페이스-uri()를 사용하여 사용하려는 노드 이름과 네임스페이스를 지정합니다. XPath 표현식을 작성하는 것은 더 번거롭습니다.
두 번째 방법(read2() 함수): XPath 네임스페이스를 설정하고 setNamespaceURIs() 함수를 사용합니다.
세 번째 방법(read3() 함수): DocumentFactory()의 네임스페이스를 설정합니다. 사용되는 함수는 setXPathNamespaceURIs()입니다. 방법 2와 3에서 XPath 표현식을 작성하는 것은 비교적 간단합니다.
네 번째 방법(read4() 함수): 방법은 세 번째 방법과 동일하지만 XPath 표현이 다릅니다(구체적으로 프로그램에 반영됨). 주로 XPath 표현의 차이를 테스트하기 위한 것이며 주로 완성도를 참조합니다. , 검색 효율성에 영향을 미칠지 여부.
(위의 네 가지 방법은 모두 XPath와 결합된 DOM4J를 사용하여 XML 파일을 구문 분석합니다.)
다섯 번째 방법(read5() 함수): 주로 성능 차이를 테스트하기 위해 XPath와 결합된 DOM을 사용하여 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;
/**
*DOM4JDOMXMLX경로
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
읽기1();
읽기2();
읽기3();
read4(); //read3() 메서드는 동일하지만 XPath 표현이 다릅니다.
읽기5();
}
공공정적voidread1(){
/*
*XPath에서 로컬 이름() 및 네임스페이스-uri() 사용
*/
노력하다{
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()='워크시트']"
+"/*[local-name()='테이블']"
+"/*[local-name()='행'][4]"
+"/*[local-name()='셀'][3]"
+"/*[local-name()='데이터'][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("선택 해제됨")
List<Element>list=doc.selectNodes(xpath);
for(객체:목록){
Elemente=(요소)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("프로그램 실행 시간:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
공공정적voidread2(){
/*
*setxpathnamespace(setNamespaceURIs)
*/
노력하다{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("통합 문서","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("선택 해제됨")
List<Element>list=x.selectNodes(doc);
for(객체:목록){
Elemente=(요소)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("프로그램 실행 시간:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
공공정적voidread3(){
/*
*setDocumentFactory()네임스페이스(setXPathNamespaceURIs)
*/
노력하다{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("통합 문서","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("선택 해제됨")
List<Element>list=doc.selectNodes(xpath);
for(객체:목록){
Elemente=(요소)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("프로그램 실행 시간:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
공공정적voidread4(){
/*
*read3() 메소드와 동일하지만 XPath 표현식이 다릅니다.
*/
노력하다{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("통합 문서","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("선택 해제됨")
List<Element>list=doc.selectNodes(xpath);
for(객체:목록){
Elemente=(요소)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("프로그램 실행 시간:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
공공정적voidread5(){
/*
*DOMANdXPath
*/
노력하다{
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();
//모든 클래스 요소의 이름 속성을 선택합니다.
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();
}캐치(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
추신: 다음은 참고용으로 XML 작업을 위한 몇 가지 온라인 도구입니다.
온라인 XML/JSON 변환 도구:
http://tools.VeVB.COm/code/xmljson
온라인 형식화 XML/온라인 압축 XML:
http://tools.VeVB.COm/code/xmlformat
XML 온라인 압축/형식 지정 도구:
http://tools.VeVB.COm/code/xml_format_compress