[英]extracting xml node(not text but complete xml ) and with other test nodes from xml file using SAX parser in java
我必須讀取每個〜500MB的大型xml文件。 批處理通常每次運行500個此類文件。 我必須從中提取文本節點, 同時從中提取xml節點 。 我在Java中使用了xpath DOM以便於使用,但是由於內存問題而無法使用,因為我的資源有限。
我打算現在在Java中使用SAX或stax-可以輕松提取文本節點,但是我不知道如何使用sax從xml提取xml節點。
一個樣品:
<?xml version="1.0"?>
<Library>
<Book name = "ABC">
<Author>John</Author>
<PrintingCompanyDT><Printer>Sam</Printer><Printmachine>Laser</Printmachine>
<AssocPrint>Oreilly</AssocPrint> </PrintingCompanyDT>
</Book>
<Book name = "123">
<Author>Mason</Author>
<PrintingCompanyDTv<Printervkelly</Printer><Printmachine>DOTPrint</Printmachine>
<AssocPrint>Oxford</AssocPrint> </PrintingCompanyDT>
</Book>
</Library>
預期結果:1)圖書:ABC:
作者:約翰
印刷公司詳細資料XML:
<PrintingCompanyDT>
<Printer>Sam</Printer>
<Printmachine>Laser</Printmachine>
<AssocPrint>Oreilly</AssocPrint>
</PrintingCompanyDT>
2)本書:123
作者:梅森
印刷公司詳細資料XML:
<PrintingCompanyDT>
<Printer>kelly</Printer>
<Printmachine>DOTPrint</Printmachine>
<AssocPrint>Oxford</AssocPrint>
</PrintingCompanyDT>
如果我嘗試以常規方式將字符添加到公共無效字符(char ch [],int開頭,int長度)方法中,則會得到以下內容
1)圖書:ABC:
作者:約翰
PrintCompany詳細資料XML:
Sam
Laser
Oreilly
確切的內容和空格。
有人可以建議如何通過Java中的SAX或StaX解析器從xml文件中提取xml節點。
我很想將XOM用於此類任務,而不是直接使用SAX或StAX。 XOM是類似於DOM或JDOM的基於樹的表示形式,但是它支持以半流方式處理XML“樹枝”,非常適合您具有許多可以獨立處理的相似元素的情況另一個。 同樣,每個Node
都有一個toXML
方法,該方法將節點打印為XML。
import nu.xom.*;
public class LibraryProcessor extends NodeFactory {
private Nodes empty = new Nodes();
private bookNum = 0;
/** Called for each closing tag in the XML */
public Nodes finishMakingElement(Element element) {
if("Book".equals(element.getLocalName())) {
bookNum++;
// process the complete Book element ...
processBook(element);
// ... and throw it away
return empty;
} else {
// process other elements (except Book) in the normal way
return super.finishMakingElement(element);
}
}
private void processBook(Element book) {
System.out.println(bookNum + ": " +
book.getAttributeValue("name"));
System.out.println("Author: " +
book.getFirstChildElement("Author").getValue());
System.out.println("PrintCompany Detail XML: " +
book.getFirstChildElement("PrintingCompanyDT").toXML());
}
public static void main(String[] args) throws Exception {
Builder builder = new Builder(new LibraryProcessor());
builder.build(new File(args[0]));
}
}
這將遍歷XML文檔, processBook
對每個Book
元素調用一次processBook
。 在processBook
您可以作為XOM節點訪問整個Book
XML樹,而不必一次將整個文件加載到內存中-兩全其美。 XOM教程的“工廠,過濾器,子類和流傳輸”部分對這種技術進行了更詳細的介紹。
該示例僅顯示XOM API的最基本的部分,但是如果您需要執行更復雜的處理,它還提供了強大的XPath支持。 例如,您可以直接訪問PrintMachine
內元素processBook
使用
Element machine = (Element)book.query("PrintingCompanyDT/PrintMachine").get(0);
或者如果結構不是那么規則,例如,如果PrintingCompanyDT
有時是Book
的直接子代,有時甚至是Book
更深子代(例如,孫子代),則可以使用以下查詢
Element printingCompanyDT = (Element)book.query(".//PrintingCompanyDT").get(0);
( //
是XPath表示法,用於查找任何級別的后代,而/
則只用於直接子代。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.