簡體   English   中英

使用Java中的SAX解析器從xml文件中提取xml節點(不是文本,而是完整的xml)以及其他測試節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM