簡體   English   中英

如何復制xml文件的部分

[英]How do I copy portions of an xml file

我有一個相對較大的xml文件。 即使我只需要文件的一部分,客戶端也會向我發送完整的文件。 結果,我想解析出我需要的部分並處理這個新文件。

這是xml的一部分

<Activity>
    <RetailFormat>ABC</RetailFormat>
    <FeedDate>2014-02-06 21:01:10</FeedDate>
    <ActivityId>665507</ActivityId>
    <ActivityTitle>ABC 3.9.14 Hawaii </ActivityTitle>
    <StartDate>2014-03-09</StartDate>
    <EndDate>2014-03-15</EndDate>
    <StartTime>00:00:00</StartTime>
    <EndTime>23:59:59</EndTime>
    <JANumber>0</JANumber>
    <PlanItemNo>0</PlanItemNo>
    <ChannelType>Circular</ChannelType>
    <Version>
    </Version>
</Activity>

我有一個需要搜索的ActivityID列表。 如果ActivityID在列表中,我想將整個Activity復制到一個新文件中。 如果沒有,我想轉到下一個活動。 實際上是從開始標記向下幾百行。 除了手動解析部分外,我沒有使用過xml。 我不知道是否存在以編程方式解決此問題的方法。 另外,此文件可能需要15K行。 文件中有1.3MM行。 通過限制處理文件的大小,我可以大大減少處理時間。

我正在尋找最有效的方法來解決此問題。 我可以手動進行一段時間,但我希望盡快限制它,而不是以后限制。

如果文件很大並且需要考慮使用內存,則應使用SAX解析器(以您選擇的語言-將其添加到標簽中)。 SAX不適用於樹,因此在解析時必須自己重建子樹。 好處是不必將整個XML加載到內存中。 您只存儲您真正需要的東西。

SAX解析器是基於事件的XML解析器,它將順序讀取文件並產生事件。 事件是通過startElement(...)startDocument(...)endElement(...)characters(...)等方法處理的。您必須編寫一個處理程序以捕獲要處理的事件。實現這些方法。

您的處理程序將必須實現startElement()characters()endElement() ,並使用實例變量保存方法之間所需的相關數據(例如:current-element,用於存儲代碼片段的數組等)。

如果內存不是問題,則可以使用DOM或XSLT。 使用DOM,可以使用getElementsByTagName("Activity")檢索<Activity>子樹的數組,然后使用該子樹上的DOM方法檢查<ActivityID> 然后,您可以復制所需的子樹,將其添加到另一個根目錄,或從當前根目錄中刪除不需要的子樹。

使用XSLT,您可以編寫一個XML模板,該模板選擇帶有XPath表達式(例如//Activity所有<Activity>節點,檢查將//Activity/ActivityID與ID列表進行比較的ID,並生成僅包含您的Activity節點的結果樹想。

告知您使用的語言,我也許可以向您發送一些示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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