1 4 способа анализа XML-файлов
Существует четыре классических метода анализа XML-файлов. Существует два основных метода синтаксического анализа: один называется SAX, а другой — DOM. SAX основан на анализе потока событий, а DOM — на анализе древовидной структуры XML-документа. На этой основе, чтобы уменьшить объем кодирования для DOM и SAX, появился JDOM. Его преимущество состоит в том, что принцип 20-80 (принцип Парето) значительно сокращает объем кода. В обычных обстоятельствах JDOM используется для реализации простых функций, таких как синтаксический анализ, создание и т. д. Но на нижнем уровне JDOM по-прежнему использует документы SAX (наиболее часто используемые), DOM и Xanan. Другой — DOM4J, который представляет собой очень превосходный Java XML API с отличной производительностью, мощными функциями и чрезвычайной простотой использования. Это также программное обеспечение с открытым исходным кодом. В настоящее время вы можете видеть, что все больше и больше программного обеспечения Java используют DOM4J для чтения и записи XML. Особо стоит отметить, что даже JAXM от Sun также использует DOM4J. Чтобы узнать о конкретном использовании четырех методов, выполните поиск в Baidu, и там будет много подробных описаний.
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 Вмешательство пространства имен
При обработке XML-файлов, преобразованных из файлов Excel или файлов других форматов, мы часто сталкиваемся с ситуациями, когда результаты анализа 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:Name="Лист1">
<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">
<Ячейка>
<Data ss:Type="String">Крыса, печатающая код</Data>
</Ячейка>
</строка>
<Row ss:AutoFitHeight="0">
<Ячейка>
<Data ss:Type="String">Санни</Data>
</Ячейка>
</строка>
</Таблица>
</Рабочий лист>
</Рабочая книга>
3.2 XPath анализирует XML-файлы с пространствами имен
Первый метод (функция read1()): используйте функции local-name() и namespace-uri(), которые входят в состав синтаксиса XPath, чтобы указать имя узла и пространство имен, которое вы хотите использовать. Написание выражений XPath более проблематично.
Второй метод (функция read2()): установите пространство имен XPath и используйте функцию setNamespaceURIs().
Третий метод (функция read3()): установите пространство имен DocumentFactory(), используемая функция — setXPathNamespaceURIs(). Написание выражений XPath во втором и третьем методах относительно просто.
Четвертый метод (функция read4()): метод тот же, что и третий метод, но выражение XPath отличается (специально отражено в программе). В основном это проверка разницы в выражении XPath, в основном ссылаясь на полноту. , и повлияет ли это на эффективность поиска.
(Все вышеперечисленные четыре метода используют DOM4J в сочетании с XPath для анализа XML-файлов)
Пятый метод (функция read5()): используйте DOM в сочетании с XPath для анализа XML-файла, главным образом для проверки разницы в производительности.
Ничто не говорит громче, чем код! Кодируйте решительно!
Скопируйте код кода следующим образом:
пакетXPath;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.Список;
importjava.util.Карта;
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.Документ;
importorg.dom4j.DocumentException;
importorg.dom4j.Элемент;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
/**
*DOM4JDOMXMLXPath
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
читать1();
читать2();
читать3();
read4(); //метод read3() тот же, но выражение XPath другое
читать5();
}
publicstaticvoidread1(){
/*
*uselocal-name() и namespace-uri() в XPath
*/
пытаться{
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()='Row'][4]"
+"/*[local-name()='Ячейка'][3]"
+"/*[local-name()='Data'][1]";*/
Stringxpath="//*[local-name()='Row'][4]/*[local-name()='Cell'][3]/*[local-name()='Data'][ 1]";
System.err.println("======uselocal-name() и namespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings («не отмечено»)
List<Element>list=doc.selectNodes(xpath);
для (Объект: список) {
Элемент = (Элемент) о;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Время работы программы:"+(endTime-startTime)+"мс");
}
}catch(DocumentExceptione){
е.printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURI)
*/
пытаться{
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(карта);
@SuppressWarnings («не отмечено»)
List<Element>list=x.selectNodes(doc);
для (Объект: список) {
Элемент = (Элемент) о;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Время работы программы:"+(endTime-startTime)+"мс");
}
}catch(DocumentExceptione){
е.printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory()namespace(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(карта);
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);
для (Объект: список) {
Элемент = (Элемент) о;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Время работы программы:"+(endTime-startTime)+"мс");
}
}catch(DocumentExceptione){
е.printStackTrace();
}
}
publicstaticvoidread4(){
/*
*То же, что и метод 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(карта);
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);
для (Объект: список) {
Элемент = (Элемент) о;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Время работы программы:"+(endTime-startTime)+"мс");
}
}catch(DocumentExceptione){
е.printStackTrace();
}
}
publicstaticvoidread5(){
/*
*DOMandXPath
*/
пытаться{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(ложь);
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)+"мс");
}
}catch(XPathExpressionExceptione){
е.printStackTrace();
}catch(ParserConfigurationExceptione){
е.printStackTrace();
}catch(SAXExceptione){
е.printStackTrace();
}catch(IOExceptione){
е.printStackTrace();
}
}
}
PS: Вот несколько онлайн-инструментов для операций с 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