PHP - แยกส่วน XML ออกจากเอกสาร XML ที่มีขนาดใหญ่กว่า

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

รับ XML นี้:

<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>

ฉันจะคืนสิ่งนี้ได้อย่างไร:

  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>

ฉันไม่ต้องการวัตถุ simplexml ฉันไม่ต้องการแปลงอะไรเลย ฉันไม่ต้องการแค่ค่าของโหนด ฉันไม่ต้องการเอกสาร XML ใหม่ที่มีส่วนหัวที่สอดคล้องกัน... แค่ส่วน XML นั้น . ไม่สามารถใช้ไลบรารีภายนอกได้... ไม่มีอะไรที่ไม่ได้มาพร้อมกับการติดตั้ง PHP มาตรฐานโดยเฉลี่ย ฉันจะแยกอันหนึ่งออกจากอันอื่นได้อย่างไร

เดาที่ดีที่สุดของฉัน? ใช้ DomDocument เพื่อรับชื่อโหนดและเนื้อหา จากนั้นสร้างสิ่งที่ฉันต้องการใหม่โดยใช้ foreach loop และสะท้อนชื่อโหนดและค่าต่างๆ รวมถึงการสิ้นสุดบรรทัดเพื่อจัดรูปแบบทุกอย่างอย่างเหมาะสม อย่างไรก็ตาม ดูเหมือนว่ามันจะดูเทอะทะอย่างเหลือเชื่อ ฉันสงสัยว่ามีวิธีที่ง่ายกว่านี้ในการดำเนินการ ดังนั้นฉันจึงอยากดูว่ามีใครใน stackoverflow บ้างไหมที่รู้ว่าวิธีนั้นคืออะไร (หรือบอกฉันได้ว่าจริงๆ แล้ว ไม่ใช่วิธีที่ง่ายกว่านี้) ขอบคุณล่วงหน้า.


person Lothar    schedule 15.12.2009    source แหล่งที่มา
comment
หากคุณมีการรับประกันเกี่ยวกับการจัดรูปแบบของอินพุตของคุณ คุณไม่ต้องการเพียงลบสองบรรทัดแรกและลบบรรทัดสุดท้ายออกใช่หรือไม่   -  person catchmeifyoutry    schedule 15.12.2009


คำตอบ (4)


บางสิ่งเช่นนี้ (โดยใช้ XPath - หากคุณมีวิธีอื่นในการรับรายการองค์ประกอบแขก คุณสามารถใช้สิ่งนั้นได้) ควรทำเคล็ดลับ

$xml = '';
$xpath = new DOMXPath($document);
foreach($xpath->query('//everyone/guest') as $guestNode) {
    $xml .= $document->saveXML($guestNode);
}
person BlackAura    schedule 15.12.2009
comment
สิ่งนี้ได้ผล แต่ด้วยเหตุผลบางอย่าง ฉันยังคงเพิ่มพื้นที่เพิ่มเติมให้กับสิ่งต่าง ๆ ฉันสามารถลบมันออกได้ด้วยการตัดแต่ง () ฉันคิดว่า ขอบคุณสำหรับคำแนะนำ. - person Lothar; 15.12.2009

$reader = new XMLReader();
$reader->xml($xml_str);
$reader->read();
$inner = $reader->readInnerXML();

// $inner is your desired xml string.

ข้อดีอย่างหนึ่งของการใช้ XMLReader คือใช้หน่วยความจำน้อยกว่าคลาส SimpleXML หรือ DOM อีกอย่างคือมันเร็วมาก

person GZipp    schedule 15.12.2009
comment
ฉันคิดว่าสิ่งนี้จะเร็วที่สุดเช่นกัน แต่เมื่อฉันได้ทำเครื่องหมายเทียบกับโซลูชันอื่นๆ กลับกลายเป็นว่าช้าที่สุด การใช้ไฟล์ XML ที่มีโหนดนับพันโหนดให้เลือก โดยทั่วไปโซลูชันอื่นจะใช้เวลาดำเนินการประมาณ 60% (โซลูชัน simplexmlelement xpath นั้นเฉลี่ย 5.8 มิลลิวินาที ในขณะที่โซลูชันที่ใช้ XMLReader นี้มีค่าเฉลี่ย 10 มิลลิวินาที) บางทีฉันอาจทำอะไรผิด ขอบคุณสำหรับคำแนะนำนะ ช่วยให้ฉันเข้าใจเรื่องทั้งหมดดีขึ้น - person Lothar; 15.12.2009
comment
ฉันเพิ่งทดสอบสิ่งนี้ด้วยตัวเองกับไฟล์ขนาดใหญ่มากและคุณก็พูดถูก มันช้ากว่า SimpleXML และ DOMXPath และเป็นอัตราส่วนเดียวกันกับการทดสอบของคุณที่แสดง นั่นทำให้ฉันประหลาดใจเช่นกัน เนื่องจากฉันพบว่าโดยทั่วไปแล้วมันจะเร็วกว่าเมื่อดึงข้อมูลทั้งหมดจากไฟล์ขนาดใหญ่แบบโหนดต่อโหนด - person GZipp; 16.12.2009
comment
มันยังคงใช้หน่วยความจำน้อยลงหรือไม่? - person shredding; 13.02.2014

ดูรายการ 5 ที่นี่:

person Andrey    schedule 21.09.2013

person    schedule
comment
ซึ่งทำได้ง่ายและเร็วหรือเร็วกว่าโซลูชันอื่นๆ ฉันขอขอบคุณความช่วยเหลือ - person Lothar; 15.12.2009