【发布时间】:2013-07-05 07:05:21
【问题描述】:
我需要将 XML 的一个节点递归地转换为 json 字符串。我大部分时间都有
$sku = "AC2061414";
$dom = new SimpleXMLElement(file_get_contents( "/usr/share//all_products.xml" ));
$query = '//sku[text() = "'.$sku.'"]';
$entries = $dom->xpath($query);
foreach ($entries as $entry) {
$parent_div = $entry->xpath( 'parent::*' );
$nodearray=array();
foreach($parent_div as $node) {
if ($node->nodeType == XML_CDATA_SECTION_NODE) {
$nodearray[$node->getName()]=$node->textContent;
}else{
$nodearray[$node->getName()]=$node;
}
}
$ajax = json_encode( $nodearray );
print($ajax);
}
运行
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product active="1" on_sale="0" discountable="1">
<sku>AC2061414</sku>
<name><![CDATA[ALOE CADABRA ORGANIC LUBE PINA COLADA 2.5OZ]]></name>
<description><![CDATA[ text text ]]></description>
<keywords/>
<price>7.45</price>
<stock_quantity>30</stock_quantity>
<reorder_quantity>0</reorder_quantity>
<height>5.25</height>
<length>2.25</length>
<diameter>0</diameter>
<weight>0.27</weight>
<color></color>
<material>aloe vera, vitamin E</material>
<barcode>826804006358</barcode>
<release_date>2012-07-26</release_date>
<images>
<image>/AC2061414/AC2061414A.jpg</image>
</images>
<categories>
<category code="528" video="0" parent="0">Lubricants</category>
<category code="531" video="0" parent="528">Flavored</category>
<category code="28" video="0" parent="25">Oral Products</category>
<category code="532" video="0" parent="528">Natural</category>
</categories>
<manufacturer code="AC" video="0">Aloe Cadabra Lubes</manufacturer>
<type code="LU" video="0">Lubes</type>
</product>
</products>
以
结尾{"product":{"@attributes":{"active":"1","on_sale":"0","discountable":"1"},"sku":"AC2061414","name":{},"description":{},"keywords":{},"price":"7.45","stock_quantity":"30","reorder_quantity":"0","height":"5.25","length":"2.25","diameter":"0","weight":"0.27","color":{},"material":"aloe vera, vitamin E","barcode":"826804006358","release_date":"2012-07-26","images":{"image":"\/AC2061414\/AC2061414A.jpg"},"categories":{"category":["Lubricants","Flavored","Oral Products","Natural"]},"manufacturer":"Aloe Cadabra Lubes","type":"Lubes"}}
除了缺少的节点值是 CDATA 之外,这似乎没问题。我确实试图解释它,但它不起作用。这里有什么诀窍?
【问题讨论】:
-
我知道这不是您真正要问的,但是您为什么还要将 XML 转换为 JSON?为什么不将节点序列化为 XML 并在下一个处理阶段对其进行解析?
-
@IMSoP 的简短之处在于它是一个临时视图系统,它是 ajaxed 的,并且由于 xml 是 40mb,因此创建迷你 json 文件以供以后使用会更快......基本上,尽管看起来很奇怪,但它在整个范围内简化了事情。这里有更多具体项目,所以我没有运行整个过程,只是我需要的部分。
-
@jeremyBass_DC 够公平的。不过,您仍然可以创建 min-XML 文件而不是 mini-JSON - 只是认为
'@attributes'键无论如何都会有效地将您与 SimpleXML 联系起来。 -
@IMSoP 是的,您是对的,我本可以将它们转换为 mini-xml 包,但是 javascript 而不是我发送 json,所以为什么不在 xml 已经在内存中而不是额外的时候执行该步骤IO 和什么不要把它推下去,因为现在我可以只提供字符串了。这是工作的扩散,实际上,这是这里的偏好,但是对于提出这个问题的普通人来说,重要的部分是 LIBXML_NOCDATA 标志很重要。谢谢你虽然
标签: php xml json xpath simplexml