ไฟล์ Java แยก xml

ฉันกำลังเขียนโค้ดเพื่อแยกไฟล์ ฉันต้องการแยกไฟล์แฟลต (ไม่เป็นไร มันทำงานได้ดี) และไฟล์ xml แนวคิดคือการแบ่งตามไฟล์จำนวนหนึ่งที่จะแยก: ฉันมีไฟล์และฉันต้องการแยกออกเป็นไฟล์ x (x คือพารามิเตอร์) ฉันกำลังแยกไฟล์โดยใช้ขนาดของไฟล์และแบ่งขนาดตามจำนวนไฟล์ที่จะแยก จากนั้นวิธีแก้ปัญหาของฉันคือใช้ BufferedReader และใช้งานเช่นนั้น

while ((n = reader.read(buffer, 0, buffer.length)) != -1) {


{

ปัญหาหลักคือสำหรับไฟล์ xml ฉันไม่สามารถแยกมันได้ แต่ฉันต้องแยกมันตามบล็อกที่คั่นด้วยแท็ก start xml และแท็ก xml สิ้นสุด:

<start tag>
bla bla xml stuff
</end tag>

ดังนั้นฉันจึงไม่สามารถตัดบล็อกที่อยู่ตรงกลางได้ ดังนั้นหากเมื่อฉันอยู่ที่ครึ่งบล็อก ขนาดของไฟล์ใหม่ของฉันมากกว่าขนาดสูงสุดของฉัน ฉันจะต้องอ่านจนจบแท็ก จากนั้นจึงจะเริ่มไฟล์ถัดไป

ปัญหาคือฉันมีเคสทุกประเภท และการค้นหาแท็กปิดท้ายค่อนข้างยาก - บล็อกอ่านข้อความจนถึงกึ่งกลางของแท็กปิดท้าย - บล็อกอ่านข้อความจนถึงจุดสิ้นสุดของแท็กปิดท้าย และไม่มีคาแรคเตอร์อื่นตามมาอีก - ฯลฯ และในเวลาเดียวกันก็จะมีการวนซ้ำและอ่านบล็อกถัดไป บางครั้งจุดสิ้นสุดของบล็อกที่ต่อกับจุดเริ่มต้นของบล็อกถัดไป ฉันมีแท็ก end xml ฉันหวังว่าคุณจะเข้าใจความคิด

คำถามของฉันคือมีใครบ้างที่มีอัลกอริธึมที่แม่นยำกว่านี้และใครที่ฉันปฏิบัติต่อกรณีพิเศษทั้งหมด

แนวคิดก็คือการแบ่งไฟล์ให้เร็วที่สุด ฉันไม่ต้องการใช้ lib เพื่อรักษาไฟล์เป็นไฟล์ xml เนื่องจากขนาดของบล็อกแคนด์เล็กกว่าหรือใหญ่มาก และฉันไม่รู้ว่าหน่วยความจำจะเพียงพอหรือไม่ หรือมี lib บางตัวที่ไม่โหลดทั้งหมดในหน่วยความจำ?

ขอบคุณมาก.

ด้านล่างนี้เป็นตัวอย่างไฟล์ xml ของฉัน

<?xml version="1.0" encoding="UTF-8" ?> 
 <myTag service="toto" version="1.5.18" >
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <inventoryDate>2009-12-31</inventoryDate> 
 <!--  reporting date --> 
  <processingDate>2010-01-29T00:00:00</processingDate> 
 </myTag>

ฉันลืมไปอย่างหนึ่ง: ไฟล์ xml ของฉันสามารถเขียนไว้ที่บรรทัดแรกทั้งหมดได้ ดังนั้นฉันจึงเดาไม่ได้เลยว่าบรรทัดหนึ่งมีแท็กเดียว


person CC.    schedule 11.05.2010    source แหล่งที่มา
comment
แท็กซ้อนกันไหม? มีรูทแท็กหลายอันในเอกสารหรือไม่   -  person aioobe    schedule 11.05.2010
comment
เลขที่. ฉันมีของบางอย่าง จากนั้นแท็กเริ่มต้นที่อยู่ด้านหลังแท็กปิด ข้างในนั้นมีแท็ก xml (ไม่เหมือนกัน) และหลังแท็กปิดสุดท้ายก็มีบางอย่าง   -  person CC.    schedule 11.05.2010
comment
แท็กเริ่มต้นและแท็กปิดมีความเฉพาะเจาะจงหรืออาจเป็นแท็กใดก็ได้ (กำหนดโดยเมื่อขนาดมากกว่าขนาดสูงสุด)   -  person Felipe Cypriano    schedule 11.05.2010
comment
เหตุใดคุณจึงต้องการรักษาบล็อคไว้? ฉันหมายความว่าไฟล์แยกผลลัพธ์ที่ได้จะไม่ถูกต้อง xml อยู่แล้ว   -  person das_weezul    schedule 11.05.2010
comment
แท็กเริ่มต้นและแท็กสิ้นสุดทั้งหมดเหมือนกันหรือไม่ กล่าวคือ ไฟล์มีลักษณะดังนี้: bla bla... ‹tag› เนื้อหาบางส่วน และแท็กอื่นๆ ‹/tag› bla bla ‹tag›...‹/tag› และอื่นๆ หรือไม่   -  person Little Bobby Tables    schedule 11.05.2010
comment
แน่นอนว่าไฟล์ใหม่จะใช้งานได้ นั่นคือปัญหาในการแบ่งและมีไฟล์ใหม่ที่ถูกต้อง ฉันไม่ต้องการเก็บบล็อกไว้ แต่เพื่อให้สามารถสร้างไฟล์ใหม่ได้เมื่อขนาดเกินขนาดสูงสุด ฉันต้องรอแท็กปิด xml จากนั้นจึงปิดไฟล์ปัจจุบันและสร้างไฟล์ใหม่   -  person CC.    schedule 11.05.2010
comment
ฉันไม่เห็นวิธีใดที่จะรับประกันว่าไฟล์ xml มีรูปแบบที่ถูกต้องซึ่งแยกด้วยวิธีนี้ หาก xml ดั้งเดิมมีขนาดใหญ่กว่าขนาดการแยก ไฟล์ที่แยกของคุณอย่างน้อยสองไฟล์ (ไฟล์แรกและไฟล์สุดท้าย) จะรับประกันว่าจะมีรูปแบบที่ไม่ดี   -  person Paul Butcher    schedule 11.05.2010
comment
ไม่ ฉันจะตรวจสอบขนาดของไฟล์ใหม่ แต่ถ้าฉันยังไม่จบบล็อก ฉันจะเขียนมันต่อไป (แม้ว่าขนาดจะเกินก็ตาม)   -  person CC.    schedule 11.05.2010
comment
(a) เอกสาร XML ต้องมีองค์ประกอบรากเดียวเท่านั้น (b) แท็กที่เปิดอยู่ทั้งหมดจะต้องปิด ข้อจำกัดทั้งสองนี้หมายความว่าคุณไม่สามารถแยกไฟล์ XML ในลักษณะที่คุณอธิบายได้ และมีชุดไฟล์ xml ที่มีรูปแบบถูกต้อง ไฟล์ XML ทุกไฟล์ที่คุณพยายามแยกจะออกมาเหมือนกันทุกประการกับที่เข้าไป   -  person Paul Butcher    schedule 11.05.2010


คำตอบ (3)


แม้ว่าคุณจะระบุว่าคุณไม่ต้องการใช้ lib ที่ถือว่าเป็นไฟล์ XML คุณอาจต้องการพิจารณาใช้ SAX

การใช้ SAX แทนที่จะเป็น DOM ความกลัวของคุณเกี่ยวกับหน่วยความจำจะบรรเทาลง เนื่องจากไฟล์ทั้งหมดไม่ได้โหลดลงในหน่วยความจำ แต่เหตุการณ์เกิดขึ้นเมื่อแอปพลิเคชันของคุณอ่านไฟล์และพบจุดสังเกตของ XML เช่นแท็กเริ่มต้นและแท็กสิ้นสุด

SAX ก็ค่อนข้างเร็วเช่นกัน

คู่มือเริ่มต้นอย่างรวดเร็วนี้น่าจะช่วยได้: http://www.saxproject.org/quickstart.html

person Paul Butcher    schedule 11.05.2010
comment
ฉันไม่ต้องการเพราะฉันไม่ต้องการโหลดบล็อกในหน่วยความจำเพราะมันอาจมีขนาดใหญ่ แต่มี lib ที่ไม่โหลดทุกอย่างในหน่วยความจำ ฉันก็โอเค - person CC.; 11.05.2010

หากแท็กปิดท้ายที่คุณต้องการนั้นออนไลน์ด้วยตัวเอง คุณก็สามารถทำได้

String line;
while ((line = reader.readLine()) != null)

แทน:

while ((n = reader.read(buffer, 0, buffer.length)) != -1)

จากนั้นแยกเป็นไฟล์ใหม่เมื่อใดก็ตามที่ line ตรงกับแท็กปิดท้ายและไฟล์ปัจจุบันมีขนาดใหญ่เพียงพอ

หากไม่ใช่บรรทัดเดียว คุณสามารถ line.find(...) แท็กแทน แยกบรรทัด ใส่ส่วนแรกในไฟล์ปัจจุบัน และบันทึกส่วนที่สองสำหรับไฟล์ถัดไป


อย่างไรก็ตาม ตามที่ระบุไว้ในความคิดเห็น ไฟล์ xml ที่แยกออกมาจะยังห่างไกลจาก xml ที่ถูกต้อง เว้นแต่ว่าคุณจะดูแลบางสิ่ง ตัวอย่างเช่น ส่วนแรกอาจมีลักษณะดังนี้:

<?xml version="1.0" encoding="UTF-8" ?> 
 <myTag service="toto" version="1.5.18" >
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">

และนั่นไม่ใช่ xml ที่ถูกต้อง ไม่เป็นเช่นกัน

  <inventoryDate>2009-12-31</inventoryDate> 
  <!--  reporting date --> 
  <processingDate>2010-01-29T00:00:00</processingDate> 
 </myTag>
person aioobe    schedule 11.05.2010

เครื่องมือที่ดีที่สุดในการแยกไฟล์ xml คือ vtd-xml ไม่เพียงแต่จะเร็วมากเท่านั้น แต่ยังเขียนโค้ดแอปของคุณได้ง่ายมากอีกด้วย เช่น การใช้ xpath

person vtd-xml-author    schedule 28.07.2013