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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: تجزیه XML در PHP  (دفعات بازدید: 2151 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین rahmani

  • Sr. Member
  • *
  • ارسال: 291
تجزیه XML در PHP
« : 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


<?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.... را لازم دارم. برای پردازش این گره گره های سطوح بالاتر رانیز باید پردازش کنم؟ نزدیکترین روش دسترسی به این گره؟

ممنونم
« آخرین ویرایش: 10 شهریور 1392، 10:27 ق‌ظ توسط rahmani »
اگر در صحنه حق و باطل زمان خويش نيستي، هر جا كه خواهي باش....
 دكتر علي شزيعتي مزيناني

آفلاین B

  • Sr. Member
  • *
  • ارسال: 354
  • جنسیت : پسر
پاسخ : تجزیه XML در PHP
« پاسخ #1 : 10 شهریور 1392، 03:44 ق‌ظ »
از توابع دوست و برادر dom استفاده کنید

http://www.w3schools.com/php/php_xml_dom.asp

آفلاین rahmani

  • Sr. Member
  • *
  • ارسال: 291
پاسخ : تجزیه XML در PHP
« پاسخ #2 : 10 شهریور 1392، 11:43 ق‌ظ »
سلام خیلی ممنون اما بهتر بود نشونی را درون link می گذاشتید:
http://www.w3schools.com/php/php_xml_dom.asp

این  code را از 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>';
?>
خیلی ممنون
« آخرین ویرایش: 10 شهریور 1392، 05:28 ب‌ظ توسط rahmani »
اگر در صحنه حق و باطل زمان خويش نيستي، هر جا كه خواهي باش....
 دكتر علي شزيعتي مزيناني

آفلاین rahmani

  • Sr. Member
  • *
  • ارسال: 291
پاسخ : تجزیه XML در PHP
« پاسخ #3 : 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);
}
خیلی ممنون
« آخرین ویرایش: 10 شهریور 1392، 06:23 ب‌ظ توسط rahmani »
اگر در صحنه حق و باطل زمان خويش نيستي، هر جا كه خواهي باش....
 دكتر علي شزيعتي مزيناني

آفلاین MrGee

  • Full Member
  • *
  • ارسال: 110
  • جنسیت : پسر
پاسخ : تجزیه XML در PHP
« پاسخ #4 : 10 شهریور 1392، 11:49 ب‌ظ »
به نظر من شما بجای اینکه بخوای با توابع خود php کار کنی بهتره از کتابخونه هایی که برای اینکار نوشته شدن استفاده کنی.
منم خودم دارم یا پروژه می نویسم که ورودیش یه فایل xml هست، برای کار کردن باهاش از xml-iterator استفاده می کنم. این کتابخونه یه فایل xml رو میگیره و اون رو به آرایه تبدیل می کنه و تحویل می ده. قبل از اون از xml2array استفاده می کردم.
اینها برای خوندن فایل xml بود، برای نوشتنش xml می اطلاعاتی ندارم ولی با سرچ کردن به راحتی میشه چند تا کلاس تو این مورد هم پیدا کرد.

آفلاین rahmani

  • Sr. Member
  • *
  • ارسال: 291
پاسخ : تجزیه XML در PHP
« پاسخ #5 : 11 شهریور 1392، 11:52 ق‌ظ »
سلام

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

خیلی ممنون
اگر در صحنه حق و باطل زمان خويش نيستي، هر جا كه خواهي باش....
 دكتر علي شزيعتي مزيناني

آفلاین MrGee

  • Full Member
  • *
  • ارسال: 110
  • جنسیت : پسر
پاسخ : تجزیه XML در PHP
« پاسخ #6 : 11 شهریور 1392، 12:21 ب‌ظ »
آره باید کار بکنه
http://www.bin-co.com/php/scripts/xml2array
بعد از تبدیل یه var_dump از خروجی بگیرین تا ببینید چه جوری تبدیل کرده.
البته من xml-iterator رو ترجیح میدم

آفلاین rahmani

  • Sr. Member
  • *
  • ارسال: 291
پاسخ : تجزیه XML در PHP
« پاسخ #7 : 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>';

خیلی ممنون
اگر در صحنه حق و باطل زمان خويش نيستي، هر جا كه خواهي باش....
 دكتر علي شزيعتي مزيناني

آفلاین rahmani

  • Sr. Member
  • *
  • ارسال: 291
پاسخ : تجزیه XML در PHP (تا اندازه ای حل شد)
« پاسخ #8 : 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);?>
اگر در صحنه حق و باطل زمان خويش نيستي، هر جا كه خواهي باش....
 دكتر علي شزيعتي مزيناني

آفلاین MrGee

  • Full Member
  • *
  • ارسال: 110
  • جنسیت : پسر
پاسخ : تجزیه XML در PHP
« پاسخ #9 : 11 شهریور 1392، 04:13 ب‌ظ »
شما باید متن xml رو به تابع بدین نه آدرس فایل رو، من خودم همون نمونه ای که تو پست اول هست رو تو متغییر x ذخیره کردم و بعد تابع رو با دستور زیر اجرا کردم و نتیجه درست بود:
var_dump(xml2array($x));‎
« آخرین ویرایش: 11 شهریور 1392، 04:15 ب‌ظ توسط MrGee »