انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: rahmani در 09 شهریور 1392، 08:19 ب‌ظ

عنوان: تجزیه XML در PHP
ارسال شده توسط: rahmani در 09 شهریور 1392، 08:19 ب‌ظ
سلام
شمار بسیاری پرونده XML هست که من باید یک سری اطلاعات را ازشون دربیارم اما با روش های گوناگون آزمایش کردم و هیچ کدام جواب نداد!!
این نشونی یک از این پرونده هاست:
http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=0071363629 (http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=0071363629)


<?php
$path 
http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=0071363629
$xml = new SimpleXMLElement($path,null,true);
foreach (
$xml->children() as $child) {
$explainResponse $child['zs:explainResponse'];
foreach ($explainResponse->children() as $childExplainResponse) {
$record $childExplainResponse['zs:record'];
foreach ($record->children() as $childRecord) {
$recordData $childRecord['zs:recordData'];
foreach ($recordData->children() as $childRecordData) {
$explain $childRecordData['explain'];
foreach ($explain->children() as $childExplain) {
$database $childExplain['databaseInfo'];
foreach ($database->children() as $childDatabase) {
$title $childDatabase['title'];
echo 'title '.$title;
}
}
}
}
}
?>

}
خواهش می کنم بفرمایید اشکال من کجاست؟ یا راه حل بهتری بفرمایید
به نظر شما نقش :zs در برخی tag's چیست؟ آیا در پردازش node عبارت :zs را هم باید جزء tag محسوب کنم؟
من فقط محتویات گره <srw_dc:dc xsi:sche.... را لازم دارم. برای پردازش این گره گره های سطوح بالاتر رانیز باید پردازش کنم؟ نزدیکترین روش دسترسی به این گره؟

ممنونم
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: B در 10 شهریور 1392، 03:44 ق‌ظ
از توابع دوست و برادر dom استفاده کنید

http://www.w3schools.com/php/php_xml_dom.asp
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: rahmani در 10 شهریور 1392، 11:43 ق‌ظ
سلام خیلی ممنون اما بهتر بود نشونی را درون link می گذاشتید:
http://www.w3schools.com/php/php_xml_dom.asp (http://www.w3schools.com/php/php_xml_dom.asp)

این  code را از http://stackoverflow.com/questions/8693043/using-simplexml-to-load-remote-url (http://stackoverflow.com/questions/8693043/using-simplexml-to-load-remote-url)  برداشتم برای نشانی که خودش مثال زده صحیح است اما برای نشانی که من لازم دارم (مثلا نشانی که بالا ذکر شد) آرایه تهی برمی گرداند. چرا؟

<?php
$context  
stream_context_create(array('http' => array('header' => 'Accept: application/xml')));
$url "http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=0071363629";
$xml file_get_contents($urlfalse$context);
$xml simplexml_load_string($xml);
echo 
'<pre>'print_r($xml); echo '</pre>';
?>
خیلی ممنون
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: rahmani در 10 شهریور 1392، 06:16 ب‌ظ
اگر code زیر
<?php
$url 
"http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=0071363629";
$xml = new SimpleXMLElement($url,null,true);
$str $xml->asXML();
echo 
'<pre>'print_r($str); echo '</pre>';
?>
را اجرا کنید آرایه ای مانند آرایه زیر
1.11info:srw/schema/1/dc-v1.1xml
 
  Anderson, Philip O.
  Knoben, James E.
  Troutman, William G.
  text
  New York : McGraw-Hill Medical Pub. Division,
  c2002.
  eng
  Includes bibliographical references and index.
  Pharmacology--Handbooks, manuals, etc.
  Drugs--Handbooks, manuals, etc.
  Pharmaceutical Preparations--Handbooks.
  Pharmacology, Clinical--Handbooks.
  http://www.loc.gov/catdir/description/mh021/00054887.html
  http://www.loc.gov/catdir/toc/mh021/00054887.html
  http://www.loc.gov/catdir/enhancements/fy0739/00054887-b.html
  URN:ISBN:0071363629
  URN:ISBN:0071124454 (International ed.)
1
نمایش داده می شود. و اگر sourpage ان را ببینید یک متن مانند این است
<pre><?xml version="1.0"?>
<zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/"><zs:version>1.1</zs:version><zs:numberOfRecords>1</zs:numberOfRecords><zs:records><zs:record><zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema><zs:recordPacking>xml</zs:recordPacking><zs:recordData><srw_dc:dc xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://purl.org/dc/elements/1.1/" xsi:schemaLocation="info:srw/schema/1/dc-schema http://www.loc.gov/standards/sru/resources/dc-schema.xsd">
  <title>Handbook of clinical drug data.</title>
  <creator>Anderson, Philip O.</creator>
  <creator>Knoben, James E.</creator>
  <creator>Troutman, William G.</creator>

  <type>text</type>
  <publisher>New York : McGraw-Hill Medical Pub. Division,</publisher>
  <date>c2002.</date>
  <language>eng</language>
  <description>Includes bibliographical references and index.</description>
  <subject>Pharmacology--Handbooks, manuals, etc.</subject>

  <subject>Drugs--Handbooks, manuals, etc.</subject>
  <subject>Pharmaceutical Preparations--Handbooks.</subject>
  <subject>Pharmacology, Clinical--Handbooks.</subject>
  <identifier>http://www.loc.gov/catdir/description/mh021/00054887.html</identifier>
  <identifier>http://www.loc.gov/catdir/toc/mh021/00054887.html</identifier>
  <identifier>http://www.loc.gov/catdir/enhancements/fy0739/00054887-b.html</identifier>

  <identifier>URN:ISBN:0071363629</identifier>
  <identifier>URN:ISBN:0071124454 (International ed.)</identifier>
</srw_dc:dc></zs:recordData><zs:recordPosition>1</zs:recordPosition></zs:record></zs:records></zs:searchRetrieveResponse>
</pre>
با وجود این که من از دستور چاپ آرایه ها (print_t($str)) برای نمایش آن استفاده کردم، اما حتی به عنوان آرایه هم نمیتوان آن را پردازش کرد؟  و این code پاسخگو نیست چرا؟
foreach ($str as $element) {
echo $element;
process($elememt);
}
خیلی ممنون
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: MrGee در 10 شهریور 1392، 11:49 ب‌ظ
به نظر من شما بجای اینکه بخوای با توابع خود php کار کنی بهتره از کتابخونه هایی که برای اینکار نوشته شدن استفاده کنی.
منم خودم دارم یا پروژه می نویسم که ورودیش یه فایل xml هست، برای کار کردن باهاش از xml-iterator استفاده می کنم. این کتابخونه یه فایل xml رو میگیره و اون رو به آرایه تبدیل می کنه و تحویل می ده. قبل از اون از xml2array استفاده می کردم.
اینها برای خوندن فایل xml بود، برای نوشتنش xml می اطلاعاتی ندارم ولی با سرچ کردن به راحتی میشه چند تا کلاس تو این مورد هم پیدا کرد.
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: rahmani در 11 شهریور 1392، 11:52 ق‌ظ
سلام

نسخه php version = 5.3 هست آیا این نسخه از کلاسی که شما گفتید پشتیبانی می کند؟
میشه یک link download  مطمئن از کلاس xml2array اینجا بگذارید یا یک طوری file آن را بفرستید چون من هر چه گشتم پیدا نکردم!

خیلی ممنون
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: MrGee در 11 شهریور 1392، 12:21 ب‌ظ
آره باید کار بکنه
http://www.bin-co.com/php/scripts/xml2array
بعد از تبدیل یه var_dump از خروجی بگیرین تا ببینید چه جوری تبدیل کرده.
البته من xml-iterator رو ترجیح میدم
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: rahmani در 11 شهریور 1392، 01:09 ب‌ظ
سلام

من با xml زیاد کار نکردم اما فکر میکنم این سایتی که من باید باهاش کار کنم نوع خاصی از هست چون توی نوشته <zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/"><zs:version>1.1</zs:version>
نمی دانم منظورش از :zs چیست؟

فقط می دانم آرایه  برگشتی  از $xml = new SimpleXMLElement($url,null,true); تهی است اما پس از استفاده از تابع
$str = $xml->asXML(); خروجی شامل متن است.

$url = "http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=0071363629";
//$url = 'voyager1.xml';
$xml = new SimpleXMLElement($url,null,true);
$xml = simplexml_load_file($url);
$str = $xml->asXML();
echo '<pre>'; print_r($xml); echo '</pre>';
echo '<pre>'; print_r($str); echo '</pre>';

خیلی ممنون
عنوان: پاسخ : تجزیه XML در PHP (تا اندازه ای حل شد)
ارسال شده توسط: rahmani در 11 شهریور 1392، 03:47 ب‌ظ
درود بر شما

همانطور که گفتم در برخی tag عبارت :zs  و وجود  : character که باعث دردسر می شد و بنابراین از امکانات SimpleXMLElement نمی شد برای پردازش ان استفاده کرد. بنابراین پس از حذف عبارت های zs: , :dc ممکن شد به عنوان یک شیء SimpleXMLElement ان را پردازش کرد.
<?php
$url 
"http://z3950.loc.gov:7090/voyager?startRecord=1&maximumRecords=1&recordSchema=dc&version=1.1&operation=searchRetrieve&query=bath.isbn=9780716798569";

$xml = new SimpleXMLElement($url,null,true);
$str $xml->asXML();
$str str_replace('zs:','',$str);
$str str_replace('srw_dc:dc','srw_dc',$str);
echo 
'<pre>'print_r($str); echo '</pre>';
$xmlArray = new SimpleXMLElement($str);?>
عنوان: پاسخ : تجزیه XML در PHP
ارسال شده توسط: MrGee در 11 شهریور 1392، 04:13 ب‌ظ
شما باید متن xml رو به تابع بدین نه آدرس فایل رو، من خودم همون نمونه ای که تو پست اول هست رو تو متغییر x ذخیره کردم و بعد تابع رو با دستور زیر اجرا کردم و نتیجه درست بود:
var_dump(xml2array($x));‎