วิธีแยกวิเคราะห์ XML ใน C ++

How Parse Xml C



ในบทความนี้ เราจะพูดถึงวิธีแยกวิเคราะห์ XML ในภาษาโปรแกรม C++ เราจะเห็นตัวอย่างการทำงานหลายอย่างเพื่อทำความเข้าใจกลไกการแยกวิเคราะห์ XML ใน C++

XML คืออะไร?

XML เป็นภาษามาร์กอัปและส่วนใหญ่ใช้สำหรับการจัดเก็บและถ่ายโอนข้อมูลอย่างเป็นระเบียบ XML ย่อมาจากภาษามาร์กอัปที่ขยายได้ มันคล้ายกับ HTML มาก XML มุ่งเน้นไปที่การจัดเก็บและถ่ายโอนข้อมูลอย่างสมบูรณ์ ในขณะที่ HTML ใช้สำหรับแสดงข้อมูลบนเบราว์เซอร์







ตัวอย่างไฟล์ XML/ไวยากรณ์ XML

นี่คือตัวอย่างไฟล์ XML:



รุ่น='1.0' การเข้ารหัส='utf-8'?>

>

student_type='ไม่เต็มเวลา'>

>NS>

>

student_type='เต็มเวลา'>

>Drake>

>

>

ต่างจาก HTML เนื่องจากเป็นภาษามาร์กอัปเชิงแท็ก และเราสามารถกำหนดแท็กของเราเองในไฟล์ XML ในตัวอย่างข้างต้น เรามีแท็กที่ผู้ใช้กำหนดหลายแท็ก เช่น ทุกแท็กจะมีแท็กปิดท้ายที่สอดคล้องกัน เป็นแท็กปิดท้ายสำหรับ . เราสามารถกำหนดแท็กที่ผู้ใช้กำหนดได้มากเท่าที่เราต้องการจัดระเบียบข้อมูล



การแยกวิเคราะห์ไลบรารีใน C ++:

มีไลบรารีต่างๆ เพื่อแยกวิเคราะห์ข้อมูล XML ในภาษาการเขียนโปรแกรมระดับสูงส่วนใหญ่ C ++ ไม่ใช่ข้อยกเว้น ต่อไปนี้คือไลบรารี C++ ที่ได้รับความนิยมมากที่สุดในการแยกวิเคราะห์ข้อมูล XML:





  1. RapidXML
  2. PugiXML
  3. TinyXML

ตามชื่อที่แนะนำ RapidXML นั้นเน้นที่ความเร็วเป็นหลัก และเป็นไลบรารีแยกวิเคราะห์สไตล์ DOM PugiXML รองรับการแปลง Unicode คุณอาจต้องการใช้ PugiXML หากคุณต้องการแปลงเอกสาร UTF-16 เป็น UTF-8 TinyXML เป็นเวอร์ชันขั้นต่ำเปล่าในการแยกวิเคราะห์ข้อมูล XML และไม่เร็วนักเมื่อเทียบกับสองรุ่นก่อนหน้า หากคุณต้องการทำงานให้เสร็จและไม่สนใจความเร็ว คุณสามารถเลือก TinyXML

ตัวอย่าง
ตอนนี้ เรามีความเข้าใจพื้นฐานเกี่ยวกับไลบรารีการแยกวิเคราะห์ XML และ XML ใน C++ แล้ว ตอนนี้เรามาดูตัวอย่างสองสามตัวอย่างเพื่อแยกวิเคราะห์ไฟล์ xml ใน C ++:



  • ตัวอย่างที่ 1: แยกวิเคราะห์ XML ใน C++ โดยใช้ RapidXML
  • ตัวอย่างที่ 2: แยกวิเคราะห์ XML ใน C++ โดยใช้ PugiXML
  • ตัวอย่างที่ 3: แยกวิเคราะห์ XML ใน C++ โดยใช้ TinyXML

ในแต่ละตัวอย่าง เราจะใช้ไลบรารีที่เกี่ยวข้องเพื่อแยกวิเคราะห์ไฟล์ XML ตัวอย่าง

ตัวอย่างที่ 1: แยกวิเคราะห์ XML ใน C++ โดยใช้ RapidXML

ในโปรแกรมตัวอย่างนี้ เราจะสาธิตวิธีแยกวิเคราะห์ xml โดยใช้ไลบรารี RapidXML ใน C++ นี่คือไฟล์ XML อินพุต (sample.xml):

รุ่น='1.0' การเข้ารหัส='utf-8'?>

>

student_type='ไม่เต็มเวลา'>

>จอห์น>

>

student_type='เต็มเวลา'>

>ฌอน>

>

student_type='ไม่เต็มเวลา'>

>Sarah>

>

>

เป้าหมายของเราคือการแยกวิเคราะห์ไฟล์ XML ด้านบนโดยใช้ C++ นี่คือโปรแกรม C++ เพื่อแยกวิเคราะห์ข้อมูล XML โดยใช้ RapidXML คุณสามารถดาวน์โหลดไลบรารี RapidXML ได้จาก ที่นี่ .

#รวม
#รวม
#รวม
#include 'rapidxml.hpp'

โดยใช้ เนมสเปซชั่วโมง;
โดยใช้ เนมสเปซRapidxml;


xml_documentเอกสาร
xml_node *root_node= โมฆะ;

intหลัก(โมฆะ)
{
ค่าใช้จ่าย << 'NSการแยกวิเคราะห์ข้อมูลนักเรียนของฉัน (sample.xml).....' <<endl;

// อ่านไฟล์ sample.xml
ifstream theFile('ตัวอย่าง.xml');
เวกเตอร์<char>กันชน((istreambuf_iterator<char>(theFile)), istreambuf_iterator<char>());
กันชน.push_back(' 0');

// แยกวิเคราะห์บัฟเฟอร์
เอกสารแยกวิเคราะห์<0>(&กันชน[0]);

// ค้นหาโหนดรูท
root_node=เอกสารfirst_node('MyStudentsData');

// วนซ้ำโหนดนักเรียน
สำหรับ (xml_node *นักเรียน_node=root_node->first_node('นักเรียน');นักเรียน_node;นักเรียน_node=นักเรียน_node->next_sibling())
{
ค่าใช้จ่าย << 'NSประเภทนักศึกษา = ' <<นักเรียน_node->first_attribute('student_type')->ค่า();
ค่าใช้จ่าย <<endl;

// โต้ตอบกับชื่อนักเรียน
สำหรับ(xml_node *student_name_node=นักเรียน_node->first_node('ชื่อ');student_name_node;student_name_node=student_name_node->next_sibling())
{
ค่าใช้จ่าย << 'ชื่อนักเรียน = ' <<student_name_node->ค่า();
ค่าใช้จ่าย <<endl;
}
ค่าใช้จ่าย <<endl;
}

กลับ 0;
}

ตัวอย่างที่ 2: แยกวิเคราะห์ XML ใน C++ โดยใช้ PugiXML

ในโปรแกรมตัวอย่างนี้ เราจะสาธิตวิธีแยกวิเคราะห์ xml โดยใช้ไลบรารี PugiXML ใน C++ นี่คือไฟล์ XML อินพุต (sample.xml):

รุ่น='1.0' การเข้ารหัส='UTF-8' สแตนด์อโลน='ไม่' ?>

รูปแบบเวอร์ชัน='1'>

>

ชื่อ='จอห์น' พิมพ์='ไม่เต็มเวลา'>

>

ชื่อ='ฌอน' พิมพ์='เต็มเวลา'>

>

ชื่อ='ซาร่า' พิมพ์='ไม่เต็มเวลา'>

>

>

>

ในโปรแกรมตัวอย่างนี้ เราจะสาธิตวิธีแยกวิเคราะห์ xml โดยใช้ไลบรารี pugixml ใน C++ คุณสามารถดาวน์โหลดไลบรารี PugiXML ได้จาก ที่นี่ .

#รวม
#include 'pugixml.hpp'

โดยใช้ เนมสเปซชั่วโมง;
โดยใช้ เนมสเปซpugi;

intหลัก()
{
ค่าใช้จ่าย << 'NSการแยกวิเคราะห์ข้อมูลพนักงาน (sample.xml).....NSNS';


xml_document doc;

// โหลดไฟล์ XML
ถ้า (!เอกสารload_file('ตัวอย่าง.xml')) กลับ -1;

xml_node tools=เอกสารเด็ก('ข้อมูลพนักงาน').เด็ก('พนักงาน');


สำหรับ (xml_node_iterator มัน=เครื่องมือเริ่ม();มัน!=เครื่องมือจบ(); ++มัน)
{
ค่าใช้จ่าย << 'พนักงาน:';

สำหรับ (xml_attribute_iterator ait=มัน->แอตทริบิวต์_begin();ของ!=มัน->คุณลักษณะ_end(); ++ของ)
{
ค่าใช้จ่าย << '' <<ของ->ชื่อ() << '=' <<ของ->ค่า();
}

ค่าใช้จ่าย <<endl;
}

ค่าใช้จ่าย <<endl;

กลับ 0;

}

ตัวอย่างที่ 3: แยกวิเคราะห์ XML ใน C++ โดยใช้ TinyXML

ในโปรแกรมตัวอย่างนี้ เราจะสาธิตวิธีแยกวิเคราะห์ xml โดยใช้ไลบรารี TinyXML ใน C++ นี่คือไฟล์ XML อินพุต (sample.xml):

รุ่น='1.0' การเข้ารหัส='utf-8'?>

>

>จอห์น>

>ฌอน>

>Sarah>

>

ในโปรแกรมตัวอย่างนี้ เราจะสาธิตวิธีแยกวิเคราะห์ xml โดยใช้ไลบรารี TinyXML ใน C++ คุณสามารถดาวน์โหลดไลบรารี่ TinyXML ได้จาก ที่นี่ .

#รวม
#รวม
#รวม
#include 'tinyxml2.cpp'

โดยใช้ เนมสเปซชั่วโมง;
โดยใช้ เนมสเปซtinyxml2;


intหลัก(โมฆะ)
{
ค่าใช้จ่าย << 'NSการแยกวิเคราะห์ข้อมูลนักเรียนของฉัน (sample.xml).....' <<endl;

// อ่านไฟล์ sample.xml
เอกสาร XMLDocument;
เอกสารLoadFile( 'ตัวอย่าง.xml' );

const char*ชื่อ=เอกสารFirstChild Element( 'MyStudentsData' )->FirstChild Element( 'นักเรียน' )->รับข้อความ();
printf( 'ชื่อนักเรียน: %sNS', ชื่อ);


XMLText*textNode=เอกสารLastChildElement( 'MyStudentsData' )->LastChildElement( 'นักเรียน' )->ลูกคนแรก()->เป็นข้อความ();
ชื่อ=textNode->ค่า();
printf( 'ชื่อนักเรียน: %sNS', ชื่อ);


กลับ 0;
}

บทสรุป

ในบทความนี้เราได้พูดคุยกันสั้น ๆ XML และดูตัวอย่างที่แตกต่างกันสามแบบของการแยกวิเคราะห์ XML ใน C++ TinyXML เป็นไลบรารีที่เรียบง่ายสำหรับการแยกวิเคราะห์ข้อมูล XML โปรแกรมเมอร์ส่วนใหญ่ใช้ RapidXML หรือ PugiXML เพื่อแยกวิเคราะห์ข้อมูล XML เป็นหลัก