XML өгөгдлийг задлан шинжилж байна. XML өгөгдлийг задлан шинжилж байна


Зохиогч: Арсений Капулкин
Хэвлэгдсэн огноо: 2012 оны 9-р сарын 21
Орчуулга: А.Панин
Орчуулсан огноо: 2013 оны 11-р сарын 10

Оршил

XML нь шаталсан бүтэцтэй баримт бичгүүдийг хүн уншихад хялбар байдлаар кодлох дүрэм журамтай стандарт тэмдэглэгээний хэл юм. текст формат. XML стандарт нь өргөн тархсан бөгөөд маш авсаархан энгийн баримт бичиг (SOAP хүсэлт гэх мэт) болон нарийн төвөгтэй өгөгдлийн хамаарал (COLLADA) бүхий олон гигабайт баримтуудыг (OpenStreetMap төсөлд ашигладаг) хоёуланг нь үүсгэхэд ашиглагддаг. XML баримт бичгийг боловсруулахын тулд хэрэглэгчид ихэвчлэн тусгай номын сан шаарддаг: энэ нь баримт бичгийг текстийн баримтаас дотоод дүрслэл болгон хөрвүүлдэг XML баримт бичгийн задлан шинжлэгчийг хэрэгжүүлэх ёстой. XML стандарт нь задлан шинжлэх хурд, хэрэглэгчийн уншигдах чадвар, кодыг задлан шинжлэхэд төвөгтэй байдлын хувьд давуу талтай тул XML баримт бичгийг задлан шинжлэх хурдан систем нь XML-г програмын өгөгдлийг хадгалах формат болгон сонгоход нөлөөлж болзошгүй юм.

Энэ бүлэгт тайлбарласан задлан шинжлэх системийн гүйцэтгэлийг сайжруулахад чиглэсэн төрөл бүрийн арга техникийг тайлбарлаж, зохиогчид C++ програмчлалын хэл: pugixml ашиглан маш үр бүтээлтэй задлан шинжлэх системийг хөгжүүлэх боломжийг олгодог. Эдгээр аргуудыг XML баримт бичгийн задлан шинжлэлийн системд ашиглаж байсан ч ихэнхийг нь бусад форматын баримт бичгийг задлан шинжлэх системд эсвэл огт хамааралгүй програм хангамжийн бүрэлдэхүүн хэсгүүдэд ашиглах боломжтой (жишээлбэл, санах ойн удирдлагын алгоритмууд нь хамааралгүй задлан шинжлэх системд өргөн хэрэглэгддэг. текст баримт бичиггазар).

XML баримт бичгийг задлан шинжлэхэд хэд хэдэн өргөн өөр арга байдаг бөгөөд задлан шинжлэх систем нь XML баримт бичгүүдийг ашиглаж байсан хүмүүсийн мэддэггүй нэмэлт алхмуудыг хийх ёстой тул хэрэгжилтийн талаар дэлгэрэнгүй ярихаасаа өмнө эхлээд хийж буй ажлыг тайлбарлах нь чухал юм.

XML задлан шинжлэх системийн загварууд

Тус бүр янз бүрийн загварууд XML баримт бичгийг задлан шинжлэх систем нь тодорхой нөхцөлд оновчтой байдаг бөгөөд эдгээр загвар бүр өөрийн гэсэн гүйцэтгэл, санах ойн хэрэглээний параметртэй байдаг. Дараах загварууд нь хамгийн өргөн хэрэглэгддэг.

  • SAX-д суурилсан задлан шинжлэх системийг (XML-д зориулсан энгийн API) ашиглах үед хэрэглэгч өөрийн байршилд хүлээн авдаг програм хангамжийн бүрэлдэхүүн хэсэг, энэ нь баримт бичгийн өгөгдлийн урсгалыг оролт болгон хүлээж, "нээлттэй шошго", "хаах шошго", "тэмдэгт доторх тэмдэгт" гэх мэт хэд хэдэн буцааж дуудлагын функцээр хангадаг. Шинжилгээний систем нь баримт бичгийн өгөгдлийг боловсруулахдаа буцааж дуудах функцийг ашигладаг. Шинжилгээ хийхэд шаардагдах контекст нь одоогийн элементийн модны гүнээр хязгаарлагддаг бөгөөд энэ нь санах ойн хэрэгцээг мэдэгдэхүйц бууруулна гэсэн үг юм. Энэ төрлийн задлан шинжлэх системийг нэг удаад баримт бичгийн зөвхөн нэг хэсгийг ашиглах боломжтой үед урсгал баримтуудыг боловсруулахад ашиглаж болно.
  • Таталт задлан шинжлэх нь үйл явцын хувьд SAX-д суурилсан задлан шинжлэхтэй төстэй - нэг баримт бичгийн элементийг нэг дор боловсруулдаг, гэхдээ задлан шинжлэх үйл явцыг удирдах арга нь өөрчлөгддөг: SAX-д суурилсан задлан шинжлэх системд задлан шинжлэх үйл явцыг дараах удирддаг. систем өөрөө буцаан дуудлагын функцийг ашигладаг бол татах задлан шинжилгээ хийх үед хэрэглэгч давталттай төстэй объект ашиглан задлан шинжлэх процессыг удирддаг.
  • DOM-д суурилсан задлан шинжлэх системийг (Баримт бичгийн объектын загвар) ашиглах үед хэрэглэгч задлан шинжлэх системд иж бүрэн баримт бичгийг буфер эсвэл текст өгөгдлийн урсгал хэлбэрээр дамжуулдаг бөгөөд үүний үндсэн дээр задлан шинжлэх систем нь санах ойн объектын дүрслэлийг үүсгэдэг. Баримт бичгийн элементүүдийн мод, тодорхой элемент тус бүрт тусдаа объект ашиглах эсвэл XML шинж чанар, түүнчлэн хүчинтэй үйлдлүүдийн багц (жишээлбэл, "бүгдийг авах хүүхдийн элементүүд this node"). pugxml номын сан энэ загварыг ашигладаг.

Шинжилгээний системийн загварыг сонгох нь ихэвчлэн баримт бичгийн хэмжээ, түүний бүтцээс хамаардаг. Pugixml нь DOM дээр тулгуурлан задлан шинжилдэг тул дараахь баримт бичигт үр дүнтэй байдаг.

  • Хэмжээ нь маш жижиг тул санах ойд бүрэн багтах боломжтой,
  • дамжих шаардлагатай зангилааны хоорондох холбоос бүхий цогц бүтэцтэй байх, эсвэл
  • нарийн төвөгтэй баримт бичгийн өөрчлөлтийг шаарддаг.

pugixml дахь архитектурын шийдэл

Pugixml номын санг хөгжүүлэх явцад DOM дүрслэлийг бий болгох асуудалд гол анхаарлаа хандуулсан, учир нь хурдан бөгөөд хөнгөн SAX-д суурилсан задлан шинжлэх системүүд (Expat гэх мэт) боломжтой байсан ч DOM-д суурилсан XML задлан задлах бүх системүүдийг үйлдвэрлэх боломжтой байсан. pugixml (2006) үүсгэх үед ашиглах нь хэтэрхий хөнгөн биш эсвэл хэтэрхий хурдан биш байсан. Үүн дээр үндэслэн puixml боловсруулах үйл явцын гол зорилго нь DOM-д суурилсан XML баримтыг удирдахад маш хурдан, хөнгөн номын санг бий болгох явдал юм.


Энэ нийтлэлийг нийтлэхийг зөвхөн тухайн нийтлэлийн зохиогчийн вэбсайт руу линкээр оруулахыг зөвшөөрнө

Энэ нийтлэлд би том XML файлыг хэрхэн задлах жишээг харуулах болно. Хэрэв таны сервер (хостинг) скриптийн ажиллах хугацааг нэмэгдүүлэхийг хориглодоггүй бол та дор хаяж гигабайт жинтэй XML файлыг задлан шинжилж болно; Би хувьдаа зөвхөн 450 мегабайт жинтэй озоны файлуудыг задлан шинжилсэн.

Том XML файлуудыг задлан шинжлэхэд хоёр асуудал гарч ирдэг:
1. Санах ой хангалтгүй.
2. Скриптийг ажиллуулахад хангалттай хугацаа байхгүй байна.

Хэрэв сервер хориглоогүй бол цаг хугацааны хоёр дахь асуудлыг шийдэж болно.
Гэхдээ санах ойтой холбоотой асуудлыг шийдэхэд хэцүү байдаг, тэр ч байтугай бид таны серверийн тухай ярьж байгаа ч 500 мегабайт файлуудыг зөөх нь тийм ч хялбар биш бөгөөд хостинг болон VDS дээр санах ойг нэмэгдүүлэх боломжгүй юм.

PHP нь SimpleXML, DOM, SAX гэсэн хэд хэдэн суурилагдсан XML боловсруулах сонголттой.
Эдгээр бүх сонголтуудыг жишээнүүдийн хамт олон нийтлэлд дэлгэрэнгүй тайлбарласан байгаа боловч бүх жишээ нь бүрэн XML баримт бичигтэй ажиллахыг харуулж байна.

Энд нэг жишээ байна, бид объектыг авдаг XML файл

Одоо та энэ объектыг боловсруулж болно, ГЭХДЭЭ...
Таны харж байгаагаар XML файлыг бүхэлд нь санах ойд уншиж, дараа нь бүх зүйлийг объект болгон задлан шинжилдэг.
Өөрөөр хэлбэл, бүх өгөгдөл санах ой руу ордог бөгөөд хэрэв хангалттай хуваарилагдсан санах ой байхгүй бол скрипт зогсох болно.

Энэ сонголт нь том файлуудыг боловсруулахад тохиромжгүй тул та файлыг мөр мөрөөр уншиж, энэ өгөгдлийг нэг нэгээр нь боловсруулах хэрэгтэй.
Энэ тохиолдолд хүчинтэй эсэхийг шалгах нь өгөгдлийг боловсруулах явцад хийгддэг тул та буцаах, жишээлбэл, хүчингүй XML файл байгаа тохиолдолд мэдээллийн санд оруулсан бүх өгөгдлийг устгах эсвэл хоёр дамжуулалтыг хийх боломжтой байх шаардлагатай. файлаар дамжуулан эхлээд хүчинтэй байхын тулд уншиж, дараа нь өгөгдлийг боловсруулахын тулд уншина уу.

Том XML файлыг задлан шинжлэх онолын жишээ энд байна.
Энэ скрипт нь файлаас нэг тэмдэгт уншиж, энэ өгөгдлийг блок болгон цуглуулж, XML задлагч руу илгээдэг.
Энэ арга нь санах ойн асуудлыг бүрэн шийдэж, ачаалал үүсгэхгүй, харин цаг хугацааны явцад асуудлыг улам хүндрүүлдэг. Цаг хугацаа өнгөрөхөд асуудлыг хэрхэн шийдэхийг доороос уншина уу.

webi_xml функц ($файл)
{

########
### өгөгдлийн функц

{
$дата хэвлэх;
}
############################################



{
$name хэвлэх;
хэвлэх_r($attrs);
}


## хаалтын шошго функц
функцийн төгсгөлийн элемент ($ задлан шинжлэгч, $ нэр)
{
$name хэвлэх;
}
############################################

($xml_parser, "өгөгдөл");

// файлыг нээх
$fp = fopen($файл, "r");

$perviy_vxod = 1 ; $өгөгдөл = "" ;



{

$simvol = fgetc ($fp); $өгөгдөл .= $simvol ;


if($simvol != ">" ) (үргэлжлүүлэх;)


цуурай "

завсарлага;
}

$өгөгдөл = "" ;
}
fclose($fp);

Webi_xml("1.xml");

?>

Энэ жишээн дээр би бүгдийг нэг функцэд webi_xml() оруулсан бөгөөд хамгийн доод хэсэгт та түүний дуудлагыг харж болно.
Скрипт нь өөрөө гурван үндсэн функцээс бүрдэнэ.
1. startElement() тагийн нээлтийг барих функц
2. Хаалтын endElement() тагийг барьж авдаг функц
3. Мөн өгөгдөл хүлээн авах функц data() .

1.xml файлын агуулгыг жор гэж үзье



< title >Энгийн талх
< ingredient amount = "3" unit = "стакан" >Гурил
< ingredient amount = "0.25" unit = "грамм" >Мөөгөнцөр
< ingredient amount = "1.5" unit = "стакан" >Халуун ус
< ingredient amount = "1" unit = "чайная ложка" >Давс
< instructions >
< step > Бүх найрлагыг нь хольж, сайтар хутгана.
< step > Даавуугаар хучиж, дулаан өрөөнд нэг цаг байлгана..
< step > Дахин зуурна, жигд хуудсан дээр тавиад зууханд хийнэ.
< step > Сайтын сайтад зочилно уу


Бид webi_xml ("1.xml") ерөнхий функцийг дуудаж бүх зүйлийг эхлүүлнэ;
Дараа нь задлан шинжлэгч нь энэ функцийг эхлүүлж, бүх шошгоны нэрийг том үсгээр хөрвүүлдэг бөгөөд ингэснээр бүх шошго ижил үсэгтэй байна.

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, үнэн);

Одоо бид шошгыг нээх, хаах, өгөгдлийг боловсруулахын тулд ямар функц ажиллахыг зааж өгнө

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "өгөгдөл");

Дараа нь нээлт ирдэг заасан файл, файлыг нэг нэгээр нь давтаж, тэмдэгт бүрийг тэмдэгт олдох хүртэл тэмдэгтийн хувьсагч руу нэмнэ > .
Хэрэв энэ нь файлын анхны хандалт бол файлын эхэнд шаардлагагүй бүх зүйл, өмнөх бүх зүйл устах болно. , энэ нь XML-ийн эхлэх ёстой шошго юм.
Анх удаа мөрт хувьсагч нь мөр агуулсан болно

Тэгээд үүнийг задлагч руу илгээнэ үү
xml_parse ($xml_parser, $data, feof ($fp));
Өгөгдлийг боловсруулсны дараа мөрийн хувьсагчийг дахин тохируулж, стринг болгон өгөгдлийг цуглуулах ажил дахин эхэлж, мөр хоёр дахь удаагаа үүсдэг.

Гурав дахь нь
</b><br>дөрөв дэх <br><b>Энгийн талх

Мөр хувьсагч нь үргэлж дууссан тагнаас үүсдэг гэдгийг анхаарна уу > Мөн хулгайч руу өгөгдөл бүхий нээлттэй, хаалттай шошго илгээх шаардлагагүй, жишээлбэл
Энгийн талх
Энэ зохицуулагчийн хувьд бүхэл бүтэн таг, дор хаяж нэг нээлттэй таг, дараагийн алхамд хаалттай таг, эсвэл файлын 1000 мөрийг шууд хүлээн авах нь чухал, энэ нь хамаагүй, гол зүйл бол шошго юм. эвдэрдэггүй, жишээ нь

le> Энгийн талх
Ингэснээр шошго нь урагдсан тул боловсруулагч руу өгөгдөл илгээх боломжгүй болно.
Та боловсруулагч руу өгөгдөл илгээх өөрийн аргыг бодож олох боломжтой, жишээлбэл, 1 мегабайт өгөгдөл цуглуулж, хурдыг нэмэгдүүлэхийн тулд боловсруулагч руу илгээнэ үү.
Энгийн</b><br><b>талх

Тиймээс та хүссэн хэмжээгээрээ илгээж болно том файлзохицуулагч руу.

Одоо энэ өгөгдлийг хэрхэн боловсруулж, хэрхэн олж авахыг харцгаая.

Нээлтийн шошго функцээс эхэлцгээе startElement ($parser, $name, $attrs)
Боловсруулалт шугаманд хүрсэн гэж үзье
< ingredient amount = "3" unit = "стакан" >Гурил
Дараа нь функц дотор $name хувьсагч тэнцүү байх болно найрлагаөөрөөр хэлбэл, нээлттэй тагны нэр (энэ нь шошгыг хааж амжаагүй байна).
Мөн энэ тохиолдолд $attrs тагийн шинж чанаруудын массив бэлэн байх бөгөөд үүнд өгөгдөл агуулагдах болно. хэмжээ = "3" ба нэгж = "шил".

Үүний дараа функцээр нээлттэй тагийн өгөгдлийг боловсруулсан өгөгдөл ($ задлан шинжлэгч, $ өгөгдөл)
$өгөгдлийн хувьсагч нь нээх болон хаах тагуудын хооронд байгаа бүх зүйлийг агуулна, манай тохиолдолд энэ нь Мука текст юм.

Мөн функцээр бидний мөрийг боловсруулах ажил дуусна endElement ($parser, $name)
Энэ нь хаалттай тагны нэр бөгөөд бидний тохиолдолд $name нь тэнцүү байх болно найрлага

Үүний дараа бүх зүйл дахин тойрог болж хувирав.

Дээрх жишээ нь зөвхөн XML боловсруулалтын зарчмыг харуулсан боловч бодит хэрэглээний хувьд үүнийг өөрчлөх шаардлагатай.
Ер нь та өгөгдлийн санд өгөгдөл оруулахын тулд том XML-г задлан задлан шинжилж, өгөгдлийг зөв боловсруулахын тулд тухайн өгөгдөл нь аль нээлттэй шошгонд хамаарах, ямар шошгын үүрлэх түвшин, дээрх шатлалд ямар шошгууд нээлттэй байгааг мэдэх хэрэгтэй. Энэ мэдээллийн тусламжтайгаар та файлыг ямар ч асуудалгүйгээр зөв боловсруулж чадна.
Үүнийг хийхийн тулд та нээлттэй шошго, үүрлэх, өгөгдлийн талаар мэдээлэл цуглуулах хэд хэдэн глобал хувьсагчийг нэвтрүүлэх хэрэгтэй.
Таны ашиглаж болох жишээ энд байна

webi_xml функц ($файл)
{
дэлхийн $webi_depth ; // үүрлэх гүнийг хянах тоолуур
$webi_depth = 0 ;
дэлхийн $webi_tag_open ; // нь нээлттэй массивыг агуулна Энэ мөчшошго
$webi_tag_open = массив();
дэлхийн $webi_data_temp; // энэ массив нь нэг тагны өгөгдлийг агуулна

####################################################
### өгөгдлийн функц
функцийн өгөгдөл ($ анализатор, $ өгөгдөл)
{
дэлхийн $webi_depth ;
дэлхийн $webi_tag_open ;
дэлхийн $webi_data_temp;
// үүрлэсэн болон одоогоор нээлттэй таг байгааг харуулсан массив руу өгөгдөл нэмнэ
$webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "data" ].= $data ;
}
############################################

####################################################
### нээх шошго функц
startElement функц ($parser, $name, $attrs)
{
дэлхийн $webi_depth ;
дэлхийн $webi_tag_open ;
дэлхийн $webi_data_temp;

// хэрэв үүрлэх түвшин тэг байхаа больсон бол нэг шошго аль хэдийн нээлттэй байна
// ба түүнээс авсан өгөгдөл нь массив дотор байгаа тул та үүнийг боловсруулж болно
хэрэв ($webi_depth)
{




" ;

хэвлэх"
" ;
хэвлэх_r($webi_tag_нээлттэй); // нээлттэй шошгуудын массив
хэвлэх"


" ;

// өгөгдлийг боловсруулсны дараа санах ойг суллахын тулд устгана уу
тохируулаагүй($GLOBALS [ "webi_data_temp" ][ $webi_depth ]);
}

// одоо дараагийн шошго нээгдэж, дараагийн алхамд цаашдын боловсруулалт хийгдэнэ
$webi_depth++; // үүрлэхийг нэмэгдүүлэх

$webi_tag_open [ $webi_depth ]= $name ; // мэдээллийн массив дээр нээлттэй таг нэмнэ
$webi_data_temp [ $webi_depth ][ $name ][ "attrs" ]= $attrs ; // одоо тагийн шинж чанаруудыг нэмнэ

}
###############################################

#################################################
## хаалтын шошго функц
функцийн төгсгөлийн элемент ($ задлан шинжлэгч, $ нэр) (
дэлхийн $webi_depth ;
дэлхийн $webi_tag_open ;
дэлхийн $webi_data_temp;

// өгөгдлийн боловсруулалт эндээс эхэлдэг, жишээлбэл, мэдээллийн санд нэмэх, файлд хадгалах гэх мэт.
// $webi_tag_open нь үүрлэх түвшингээр нь нээлттэй тагуудын гинжийг агуулж байна
// жишээ нь $webi_tag_open[$webi_depth] мэдээлэл нь одоогоор боловсруулагдаж байгаа нээлттэй тагны нэрийг агуулна.
// $webi_depth тагийн үүрлэх түвшин
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]["attrs"] шошгоны шинж чанаруудын массив
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]["data"] шошго өгөгдөл

"Өгөгдөл" хэвлэх. $webi_tag_open [ $webi_depth ]. "--" .($webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "data" ]). "
" ;
print_r ($webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "attrs" ]);
хэвлэх"
" ;
хэвлэх_r($webi_tag_нээлттэй);
хэвлэх"


" ;

Тохируулаагүй($GLOBALS [ "webi_data_temp" ]); // өгөгдлийг боловсруулсны дараа шошгыг хаасан тул бид бүх массивыг өгөгдөлтэй хамт устгана
тохируулаагүй($GLOBALS [ "webi_tag_open" ][ $webi_depth ]); // хаагдсанаас хойш энэ нээлттэй тагны талаарх мэдээллийг устгана уу

$webi_depth --; // үүрлэхийг багасгах
}
############################################

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, үнэн);

// таг нээх, хаах үед ямар функц ажиллахыг заана
xml_set_element_handler($xml_parser, "startElement", "endElement");

// өгөгдөлтэй ажиллах функцийг зааж өгнө
xml_set_character_data_handler($xml_parser, "өгөгдөл");

// файлыг нээх
$fp = fopen($файл, "r");

$perviy_vxod = 1 ; // файлын эхний оруулгыг шалгахын тулд дарцаг
$өгөгдөл = "" ; // энд бид файлаас өгөгдлийг хэсэг хэсгээр нь цуглуулж xml задлагч руу илгээдэг

// файлын төгсгөл олдох хүртэл давталт
байхад (! feof ($fp ) болон $fp )
{
$simvol = fgetc ($fp); // файлаас нэг тэмдэгт уншина
$өгөгдөл .= $simvol ; // энэ тэмдэгтийг илгээх өгөгдөлд нэмнэ

// хэрэв тэмдэгт нь төгсгөлийн таг биш бол давталтын эхэнд буцаж очоод өгөгдөлд өөр тэмдэгт нэмэх гэх мэт төгсгөлийн таг олдох хүртэл үргэлжилнэ.
if($simvol != ">" ) (үргэлжлүүлэх;)
// хэрэв хаалтын шошго олдсон бол одоо бид цуглуулсан өгөгдлийг боловсруулахад илгээх болно

// энэ нь файлын анхны оруулга мөн эсэхийг шалгаад бид шошгоны өмнөх бүх зүйлийг устгах болно// заримдаа XML эхлэхээс өмнө хог хаягдалтай тулгардаг (болхи засварлагч эсвэл файлыг өөр серверээс скриптээр хүлээн авсан)
if($perviy_vxod ) ( $data = strstr ($data , "

// одоо өгөгдлийг xml задлагч руу шиднэ үү
хэрэв (! xml_parse ($xml_parser, $data, feof ($fp))) (

// энд та хүчинтэй байдлын алдааг боловсруулж, хүлээн авах боломжтой...
// алдаа гармагц задлан шинжилнэ
цуурай "
XML алдаа: " . xml_error_string(xml_get_error_code($xml_parser));
цуурай "шугам дээр" . xml_get_current_line_number ($xml_parser);
завсарлага;
}

// задлан шинжилсний дараа цуглуулсан өгөгдлийг мөчлөгийн дараагийн алхамд хаяна.
$өгөгдөл = "" ;
}
fclose($fp);
xml_parser_free($xml_parser);
// глобал хувьсагчдыг устгаж байна
тохируулаагүй($GLOBALS [ "webi_depth" ]);
тохируулаагүй($GLOBALS [ "webi_tag_open" ]);
тохируулаагүй($GLOBALS [ "webi_data_temp" ]);

Webi_xml("1.xml");

?>

Энэ жишээг бүхэлд нь тайлбар дагалдаж байгаа тул одоо туршиж үзээрэй.
Өгөгдөлтэй ажиллах функцэд өгөгдлийг массив руу оруулаад зогсохгүй ""-г ашиглан нэмдэг болохыг анхаарна уу. .=" Учир нь өгөгдөл бүхэлдээ ирэхгүй байж магадгүй бөгөөд хэрэв та зүгээр л даалгавар өгвөл та өгөгдлийг үе үе хэсэгчлэн хүлээн авах болно.

За, энэ бол одоо ямар ч хэмжээтэй файлыг боловсруулахад хангалттай санах ой байгаа боловч скриптийн ажиллах хугацааг хэд хэдэн аргаар нэмэгдүүлэх боломжтой.
Скриптийн эхэнд функц оруулна уу
тогтоосон_цаг_хязгаар (6000);
эсвэл
ini_set ("хамгийн их_гүйцэтгэх_цаг" , "6000" );

Эсвэл .htaccess файлд текст нэмнэ үү
php_утга хамгийн их_гүйцэтгэх_хугацаа 6000

Эдгээр жишээнүүд нь скриптийн ажиллах хугацааг 6000 секунд хүртэл нэмэгдүүлэх болно.
Аюулгүй горимыг унтраасан үед л та цагийг ингэж нэмэгдүүлэх боломжтой.

Хэрэв танд php.ini-г засварлах эрх байгаа бол ашиглах хугацааг нэмэгдүүлэх боломжтой
хамгийн их_гүйцэтгэх_хугацаа = 6000

Жишээлбэл, Masterhost хостинг дээр энэ нийтлэлийг бичиж байх үед скриптийн хугацааг нэмэгдүүлэхийг хориглодог. аюулгүйн горим, гэхдээ хэрэв та мэргэжлийн бол masterhost дээр өөрийн php програмыг хийж болно, гэхдээ энэ нь энэ нийтлэлд байхгүй.

XML задлан шинжилнэ гэдэг нь үндсэндээ XML баримтыг үзэж, харгалзах өгөгдлийг буцаана гэсэн үг юм. Хэдийгээр улам бүр нэмэгдэж буй вэб үйлчилгээнүүд өгөгдлийг буцааж өгдөг JSON форматГэхдээ ихэнх нь XML-г ашигладаг хэвээр байгаа тул хэрэв та бүрэн хүрээг ашиглахыг хүсвэл XML задлан шинжлэх нь чухал юм боломжтой интерфэйсүүд API.

Өргөтгөл ашиглах Энгийн XML PHP 5.0 дээр дахин нэмсэн PHP дээр XML-тэй ажиллах нь маш хялбар бөгөөд энгийн. Энэ нийтлэлд би үүнийг хэрхэн хийхийг танд үзүүлэх болно.

Ашиглалтын үндэс

Дараах жишээнээс эхэлцгээе хэл.xml:


>

> 1972>
> Деннис Ричи >
>

> 1995>
> Расмус Лердорф >
>

> 1995>
> Жеймс Гослинг >
>
>

Энэхүү XML баримт бичиг нь програмчлалын хэлнүүдийн жагсаалтыг, хэл бүрийн талаархи зарим мэдээллийг агуулсан болно: нэвтрүүлсэн жил, түүнийг бүтээгчийн нэр.

Эхний алхам бол функцуудыг ашиглан XML-г ачаалах явдал юм simplexml_load_file(), эсвэл simplexml_load_string(). Функцуудын нэрнээс харахад эхнийх нь файлаас XML-г ачаалах ба хоёр дахь нь мөрөөс XML-г ачаалах болно.

Энэ хоёр функц нь DOM модыг бүхэлд нь санах ойд уншиж, объектыг буцаана SimpleXMLElement. Дээрх жишээнд объектыг $languages ​​хувьсагчд хадгалсан болно. Та функцуудыг ашиглаж болно var_dump()эсвэл хэвлэх_r()Хэрэв та хүсвэл буцаж ирсэн объектын талаар дэлгэрэнгүй мэдээлэл авах боломжтой.

SimpleXMLElement Объект
[lang] => Массив
[ 0 ] => SimpleXMLElement Объект
[@attributes] => Массив
[нэр] => C
[харагдсан] => 1972
[бүтээгч] => Деннис Ричи
[ 1 ] => SimpleXMLElement Объект
[@attributes] => Массив
[нэр] => PHP
[гарсан] => 1995 он
[бүтээгч] => Расмус Лердорф
[ 2 ] => SimpleXMLElement Объект
[@attributes] => Массив
[нэр] => Java
[гарсан] => 1995 он
[бүтээгч] => Жеймс Гослинг
)
)

Энэ XML нь үндсэн элементийг агуулж байна хэлүүд, дотор нь гурван элемент байдаг lang.Массивын элемент бүр элементтэй тохирч байна lang XML баримт бичигт.

Та операторыг ашиглан объектын шинж чанарт хандах боломжтой -> . Жишээлбэл, $languages->lang нь эхний элементтэй тохирох SimpleXMLElement объектыг буцааж өгөх болно lang. Энэ объект нь гарч ирсэн ба бүтээгч гэсэн хоёр шинж чанарыг агуулна.

$languages ​​-> lang [ 0 ] -> гарч ирэв;
$languages ​​-> lang [ 0 ] -> бүтээгч;

Хэлний жагсаалтыг харуулах, тэдгээрийн шинж чанарыг харуулах нь стандарт гогцоо ашиглан хялбархан хийж болно тус бүр.

foreach ($languages ​​-> lang гэж $lang) (
хэвлэхf(
"" ,
$lang [ "нэр" ] ,
$lang -> гарч ирсэн,
$lang -> бүтээгч
) ;
}

Хэлний нэрийг авахын тулд би элементийн lang атрибутын нэрэнд хэрхэн хандсаныг анхаарна уу. Ингэснээр та SimpleXMLElement объект хэлбэрээр дүрслэгдсэн элементийн аль ч атрибут руу хандах боломжтой.

Нэрийн орон зайтай ажиллах

Төрөл бүрийн вэб үйлчилгээний XML-тэй ажиллахдаа элементийн нэрийн орон зайтай нэгээс олон удаа таарах болно. Өөрсдөө өөрчилье хэл.xmlнэрийн орон зайг ашиглах жишээг харуулахын тулд:



xmlns:dc =>

> 1972>
> Деннис Ричи >
>

> 1995>
> Расмус Лердорф >
>

> 1995>
> Жеймс Гослинг >
>
>

Одоо элемент бүтээгчнэрийн талбарт тохирно DCЭнэ нь http://purl.org/dc/elements/1.1/ руу чиглэнэ. Хэрэв та манай өмнөх кодыг ашиглан хэл бүтээгчдийг хэвлэхийг оролдвол энэ нь ажиллахгүй болно. Элементийн нэрсийн орон зайг уншихын тулд та дараах аргуудын аль нэгийг ашиглах хэрэгтэй.

Эхний арга бол элементийн нэрийн орон зайд хандахдаа URI нэрийг шууд кодонд ашиглах явдал юм. Үүнийг хэрхэн хийхийг дараах жишээ харуулж байна.

$dc = $languages ​​-> lang [ 1 ] -> хүүхдүүд( "http://purl.org/dc/elements/1.1/") ;
echo $dc -> бүтээгч ;

Арга хүүхдүүд()нэрийн орон зай авч угтвараар эхэлсэн хүүхэд элементүүдийг буцаана. Үүнд хоёр аргумент шаардагдах бөгөөд эхнийх нь XML нэрийн орон зай, хоёр дахь нь нэмэлт аргумент бөгөөд үндсэндээ худлаа. Хэрэв хоёр дахь аргументыг ҮНЭН гэж тохируулсан бол нэрийн орон зайг угтвар гэж үзнэ. Хэрэв ХУДАЛ бол нэрийн талбарыг URL нэрийн орон зай гэж үзэх болно.

Хоёрдахь арга нь баримтаас URI нэрийг уншиж, элементийн нэрийн орон зайд хандахдаа ашиглах явдал юм. Энэ нь үнэндээ элементүүдэд хандах илүү сайн арга юм, учир нь та URI-д хатуу кодлох шаардлагагүй.

$namespaces = $languages ​​-> getNamespaces (үнэн);
$dc = $languages ​​​​ -> lang [ 1 ] -> хүүхдүүд (($namespaces [ "dc" ] );

echo $dc -> бүтээгч ;

Арга GetNamespaces()угтвар нэр болон тэдгээртэй холбоотой URI-н массивыг буцаана. Энэ нь анхдагчаар тохируулагдсан нэмэлт параметрийг хүлээн авдаг худлаа. Хэрэв та үүнийг тохируулсан бол үнэн, дараа нь энэ арга нь эцэг эх болон хүүхдийн зангилаанд ашигласан нэрсийг буцаана. Үгүй бол энэ нь зөвхөн эх зангилаанд ашиглагддаг нэрсийн орон зайг олдог.

Одоо та дараах хэлний жагсаалтыг давтаж болно:

$languages ​​= simplexml_load_file ("languages.xml");
$ns = $languages ​​-> getNamespaces (үнэн);

foreach ($languages ​​-> lang гэж $lang) (
$dc = $lang -> хүүхдүүд ($ns [ "dc" ] );
хэвлэхf(
"

%s нь %d дээр гарч ирсэн бөгөөд %s үүсгэсэн.

" ,
$lang [ "нэр" ] ,
$lang -> гарч ирсэн,
$dc -> бүтээгч
) ;
}

Практик жишээ - YouTube-ээс видео сувгийг задлан шинжлэх

YouTube сувгаас RSS feed авч, бүх видеоны холбоосыг харуулдаг жишээг харцгаая. Үүнийг хийхийн тулд дараах хаягаар холбогдоно уу.

http://gdata.youtube.com/feeds/api/users/xxx/uploads

URL нь тухайн сувгийн хамгийн сүүлийн үеийн видеонуудын жагсаалтыг XML форматаар буцаана. Бид XML-г задлан шинжилж, видео бүрийн хувьд дараах мэдээллийг авна.

  • Видеоны холбоос
  • Бяцхан зураг
  • Нэр

Бид XML-г хайж, ачаалснаар эхэлнэ:

$channel = "Сувгийн_нэр" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $ суваг. "/байршуулсан" ;
$xml = file_get_contents($url);

$feed = simplexml_load_string ($xml) ;
$ns = $feed -> getNameSpaces ( үнэн );

Хэрэв та XML тэжээлийг харвал тэнд хэд хэдэн элемент байгааг харж болно аж ахуйн нэгж, тус бүр дэлгүүрүүд дэлгэрэнгүй мэдээлэлсувгийн тодорхой видеоны тухай. Гэхдээ бид зөвхөн зургийн өнгөц зураг, видеоны URL болон гарчгийг ашигладаг. Эдгээр гурван элемент нь уг элементийн удам юм бүлэг, энэ нь эргээд хүүхэд юм нэвтрэх:

>

>



Гарчиг… >

>

>

Бид зүгээр л бүх элементүүдийг үзэх болно нэвтрэх, мөн тус бүрийн хувьд бид шаардлагатай мэдээллийг задлах болно. тэрийг тэмдэглэ тоглогч өнгөц зурагТэгээд гарчигмедиа нэрийн зайд байна. Тиймээс бид өмнөх жишээн дээрх шиг ажиллах ёстой. Бид баримтаас нэр авч, элементүүдэд хандахдаа нэрийн орон зайг ашигладаг.

foreach ($feed -> оруулах $entry ) (
$group = $entry -> хүүхдүүд ($ns [ "медиа" ] );
$ групп = $ групп -> бүлэг ;
$thumbnail_attrs = $group -> өнгөц зураг [ 1 ] -> шинж чанарууд () ;
$зураг = $thumbnail_attrs [ "url" ] ;
$player = $group -> тоглогч -> шинж чанарууд () ;
$link = $player [ "url" ] ;
$ гарчиг = $ бүлэг -> гарчиг;
хэвлэхf( "

" ,
$ тоглогч, $ зураг, $ гарчиг);
}

Дүгнэлт

Одоо та хэрхэн ашиглахаа мэддэг болсон Энгийн XML XML өгөгдлийг задлан шинжлэхийн тулд та өөр өөр API-тай өөр XML тэжээлийг задлан шинжилж ур чадвараа сайжруулах боломжтой. Гэхдээ SimpleXML нь DOM-г бүхэлд нь санах ой руу уншдаг гэдгийг анхаарах нь чухал бөгөөд хэрэв та том өгөгдлийн багцыг задлан шинжилж байгаа бол таны санах ой дуусах магадлалтай. SimpleXML-ийн талаар илүү ихийг мэдэхийг хүсвэл баримт бичгийг уншина уу.


Хэрэв танд асуулт байгаа бол бид ашиглахыг зөвлөж байна