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