PHP、XML 获取记录节点和值并将它们放入 JSON 数组? [复制]

Posted

技术标签:

【中文标题】PHP、XML 获取记录节点和值并将它们放入 JSON 数组? [复制]【英文标题】:PHP, XML Get a records nodes and values and put them in a JSON Array? [duplicate] 【发布时间】:2012-09-25 13:14:15 【问题描述】:

可能重复:Implementing condition in XPath and XQueryphp convert XML to JSON

如何从包含 Product = Product1 的记录中获取所有子注释 并将它们放入 JSON 数组中?

<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt1]]</PVAL>
<PROP NAME="Value">
<PVAL><!CDATA[10]]</PVAL>
<PROP NAME="Status">
<PVAL><!CDATA[Active]]</PVAL>
</RECORD>
<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt2]]</PVAL>
<PROP NAME="Value">
<PVAL><!CDATA[20]]</PVAL>
<PROP NAME="Status">
<PVAL><!CDATA[Active]]</PVAL>
</RECORD>
<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt3]]</PVAL>
<PROP NAME="Value">
<PVAL><!CDATA[30]]</PVAL>
<PROP NAME="Status">
<PVAL><!CDATA[Active]]</PVAL>
</RECORD>

我需要 iPad 应用的数据,调用类似 www.products.com/product.php?Product1

让 JSON 看起来像


 "Product": [
  "Name":"Product1" , "Value":"10" , "Status":"Active" 
 ]
 

编辑:使用 XML 阅读器的解决方案

<?php
$z = new XMLReader;
$z->open('products.xml');

$doc = new DOMDocument;

// move to the first <product /> node
while ($z->read() && $z->name !== 'RECORD');

// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'RECORD')


    $node = simplexml_import_dom($doc->importNode($z->expand(), true));


    $strvalue = $node->PROP[6]->PVAL;
    echo $strvalue."<p>" ;

    // go to next <product />
    $z->next('RECORD');

?>

【问题讨论】:

没有什么比 json array 更好的了。你的意思是json格式的字符串吗? 据我所知,有一个叫做 JSON 数组的东西,但它是由 JSON 字符串/对象组成的 w3schools.com/json/json_syntax.asp @UlrikVadstrup 我说的是 php。 This article 可以帮到你。 【参考方案1】:

首先,仅查看您的 XML 就让我头疼。以下是您需要进行的一些更改:

    如果您要拥有多个节点,则需要一个包装器,例如在所有节点之前和所有节点之后。 您的 PROP 节点需要一个结束标记 您的 CDATA 格式错误,正确的格式是

这是我新格式化的 XML 的示例:

<?xml version='1.0'?>
<RECORDS>
    <RECORD>
    <PROP NAME="Product">
        <PVAL><![CDATA[Produkt1]]></PVAL>
    </PROP>
    <PROP NAME="Value">
        <PVAL><![CDATA[10]]></PVAL>
    </PROP>
    <PROP NAME="Status">
        <PVAL><![CDATA[Active]]></PVAL>
    </PROP>
</RECORD>
<RECORD>
    <PROP NAME="Product">
        <PVAL><![CDATA[Produkt2]]></PVAL>
    </PROP>
    <PROP NAME="Value">
        <PVAL><![CDATA[20]]></PVAL>
    </PROP>
    <PROP NAME="Status">
        <PVAL><![CDATA[Active]]></PVAL>
    </PROP>
</RECORD>
<RECORD>
    <PROP NAME="Product">
        <PVAL><![CDATA[Produkt3]]></PVAL>
    </PROP>
    <PROP NAME="Value">
        <PVAL><![CDATA[30]]></PVAL>
    </PROP>
    <PROP NAME="Status">
        <PVAL><![CDATA[Active]]></PVAL>
    </PROP>
</RECORD>

一旦 XML 的格式正确,我会使用 SimpleXML 之类的东西来解析它:

$xml = simplexml_load_string( $xml_string );
foreach ($xml->RECORD as $record)

    if ($record->PROP[0]->PVAL == 'Produkt1')
    
        echo json_encode( $record );
    

我还认为您可以从重构整个 XML 中真正受益。比如:

<RECORDS>
    <RECORD ID="1">
        <PRODUCT>PRODUCT 1</PRODUCT>
        <VALUE>10</VALUE>
        <STATUS>Active</STATUS>
    </RECORD>
    <RECORD ID="2">
        <PRODUCT>PRODUCT 2</PRODUCT>
        <VALUE>20</VALUE>
        <STATUS>Active</STATUS>
    </RECORD>
    <RECORD ID="3">
        <PRODUCT>PRODUCT 3</PRODUCT>
        <VALUE>30</VALUE>
        <STATUS>Active</STATUS>
    </RECORD>
</RECORDS>

那么 PHP 会是这样的:

foreach ($xml->RECORD as $record)

    $attr = $record->attributes();
    if( $attr['ID'] == '1' )
    
        echo json_encode( $record );
    

【讨论】:

非常感谢您的建设性回答 :-) 不幸的是,我不是制作 xml 文件的人,我刚刚被告知要拖出信息。我会做我自己的例子,并使用你的代码让他改变事情。我稍后会测试 - 谢谢一百万:-D 嗯.....我肯定在正确的轨道上。当我创建一个“小”测试文件时,一切都按计划进行。但是我的 XML 文件是 100 mb,所以我想我应该使用 XMLreader 而不是 SimpleXML。任何人都可以给我一点帮助吗?为 xmlreader 编写 Jason 的代码? 我如何读出“名称”值 - 比如“状态”?

以上是关于PHP、XML 获取记录节点和值并将它们放入 JSON 数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 查找 XML 节点并放入现有的 HTML 表中

将属性和值填充到第4个父节点的XML文件的所有父节点

Odoo - 遍历字段,获取值并将它们放入新字段

使用循环从 plist 的根级别获取字典数组并将其放入变量中

从文件中获取不同类型的项目并将它们添加到数组中

如何修复关闭后插入的 XML 节点