Nasıl php ile bir XML dosyası işlem?

4 Cevap php

Bir satın alma yapıldığında benim geçidi (Mesajları) benim sunucu bir xml datafeed gönderir. XML şöyle:

 <?xml version='1.0' standalone='yes'?>
 <foxydata>
<datafeed_version>XML FoxyCart Version 0.6</datafeed_version>
<transactions>
	<transaction>
		<id>616</id>
		<transaction_date>2007-05-04 20:53:57</transaction_date>
		<customer_id>122</customer_id>
		<customer_first_name>Dirk</customer_first_name>
		<customer_last_name>Gently</customer_last_name>
		<shipping_total>4.38</shipping_total>
		<order_total>24.38</order_total>
		<order_total>24.38</order_total>
                 <customer_password>1aab23051b24582c5dc8e23fc595d505</customer_password>
		<custom_fields>
			<custom_field>
				<custom_field_name>My_Cool_Text</custom_field_name>
				<custom_field_value>Value123</custom_field_value>
			</custom_field>
		</custom_fields>
		<transaction_details>
			<transaction_detail>
				<product_name>foo</product_name>
				<product_price>20.00</product_price>
				<product_quantity>1</product_quantity>
				<product_weight>0.10</product_weight>
				<product_code></product_code>
				<subscription_frequency>1m</subscription_frequency>
				<subscription_startdate>2007-07-07</subscription_startdate>
				<next_transaction_date>2007-08-07</next_transaction_date>
				<shipto>John Doe</shipto>
				<category_description>Default for all products</category_description>
				<category_code>DEFAULT</category_code>
				<product_delivery_type>shipped</product_delivery_type>
				<transaction_detail_options>
					<transaction_detail_option>
						<product_option_name>color</product_option_name>
						<product_option_value>blue</product_option_value>
						<price_mod></price_mod>
						<weight_mod></weight_mod>
					</transaction_detail_option>
				</transaction_detail_options>
			</transaction_detail>
		</transaction_details>
		<shipto_addresses>
			<shipto_address>
				<address_name>John Doe</address_name>
				<shipto_first_name>John</shipto_first_name>
				<shipto_last_name>Doe</shipto_last_name>
				<shipto_address1>2345 Some Address</shipto_address1>
				<shipto_address2></shipto_address2>
				<shipto_city>Some City</shipto_city>
				<shipto_state>TN</shipto_state>
				<shipto_postal_code>37013</shipto_postal_code>
				<shipto_country>US</shipto_country>
				<shipto_shipping_service_description>DHL: Next Afternoon</shipto_shipping_service_description>
				<shipto_subtotal>52.15</shipto_subtotal>
				<shipto_tax_total>6.31</shipto_tax_total>
				<shipto_shipping_total>15.76</shipto_shipping_total>
				<shipto_total>74.22</shipto_total>
				<shipto_custom_fields>
					<shipto_custom_field>
						<shipto_custom_field_name>My_Custom_Info</shipto_custom_field_name>
						<shipto_custom_field_value>john's stuff</shipto_custom_field_value>
					</shipto_custom_field>
					<shipto_custom_field>
						<shipto_custom_field_name>More_Custom_Info</shipto_custom_field_name>
						<shipto_custom_field_value>more of john's stuff</shipto_custom_field_value>
					</shipto_custom_field>
				</shipto_custom_fields>
			</shipto_address>
		</shipto_addresses>
	</transaction>
</transactions>
</foxydata>
XML;

Yaşandığı ilk kez XML ayrıştırma gibi, ben o birileri ben o zaman bir mysql tabloya istediğim verileri de ekleyebilirsiniz ben geçiyor ve bir php dizi ya da bunun gibi bir şey içine bu dönüm hakkında gitmek nasıl bana göster umuyordum.

Nedir bu yapıyor hakkında gitmek için en kolay yolu nedir?

4 Cevap

Size ihtiyacınız builtin XML parser, manuel vermek gereken her şeyi kullanabilirsiniz. Ama deneyim konuşan, ben gerçekten much daha hızlı ve daha sonra PHP ile alabilirsiniz başka bir şey kullanmak çok kolay olduğundan, Xpath öğrenme tavsiye ederim. Sen, introduction@w3schools ile başlamak nice examples in the specs bakabilirsiniz ve sonunda PHP functions kullanabilirsiniz.

Işlem id seçimi için örnek bir sorgu olacak

$document = new DOMDocument();
$document->load('YourFile.xml');
$xpath = new DOMXPath($document);

# Query id
$ids = $xpath->query('/transactions/transaction/id/text()');
# $ids is a DOMNodeList object
assert($ids->length === 1);
$id = $ids->item(0);

# Query date
$dates = $xpath->query('/transactions/transaction/transaction_date/text()');
# $dates is a DOMNodeList object
assert($dates->length === 1);
$id = $dates->item(0);

Eğer SimpleXML gibi, bir PHP XML çözümleyici kullanabilirsiniz

Siz iki PHP diziler, öğretmek etiketi değerler dizisindeki göründüğü için işaretçiler ile veri ile bir başka içine XML almak için xml_parse_into_struct ile aşağıdaki satırları kullanabilirsiniz:

$parser = xml_parser_create();

$values = array();
$index = array();

xml_parse_into_struct  ($parser, $xml, &$values, &$index);

var_dump($values);
var_dump($index)

$ Xml XML verilerini içerir. Ben daha fazla bilgi için bağlantı veren manuel sayfasında örnekleri kontrol edin.

Parsing XML:
If your server receives just the XML ( not in $_POST['xmlfeed']) :

$xml = file_get_contents("php://input");  
$data = simplexml_load_string ($xml);

Don't convert the SimpleXML object into an array. It works pretty much like an array anyway. You can use foreach and it's easy to access its elements.
http://us2.php.net/manual/en/simplexml.examples-basic.php

P.S. Büyük XML belgeleri yerine SimpleXML arasında XMLReader () kullanın.