0

我有一些 xml,这是它的简单版本。

<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>

在内容上使用 SimpleXML,

 $obj = simplexml_load_string( $xml );

我可以使用$obj->xpath( '//items/item' );并访问@attributes。

我需要一个数组结果,所以我尝试了这个json_decode(json_encode($obj),true)技巧,但这看起来正在删除对@attributes 的访问(即abc =“123”)。

是否有另一种方法可以提供对属性的访问并为我留下一个数组?

4

5 回答 5

2

您需要调用 attributes() 函数。

示例代码:

$xmlString = '<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>';

$xml = new SimpleXMLElement($xmlString);

foreach( $xml->items->item as $value){
$my_array[] =  strval($value->attributes());
}

print_r($my_array);

评估

于 2013-08-31T15:17:50.207 回答
1
$xml = new SimpleXMLElement($xmlString);

$xml 现在是一个对象。要获取属性的值:

$xml->something['id'];

其中“id”是属性的名称。

于 2013-08-31T14:59:21.833 回答
1

你可以使用json_encodeandjson_decode来添加你缺少的东西,因为json_encode-ing 遵循一些特定的规则SimpleXMLElement

如果您对规则及其详细信息感兴趣,我已经写了两篇关于它的博客文章:

对您而言,可能更有趣的是第三部分,它展示了如何修改 json 序列化并提供您自己的格式(例如,保留属性):

它附带了一个完整的示例,这是代码的摘录:

$xml = '<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>';

$obj = simplexml_load_string($xml, 'JsonXMLElement');

echo $json = json_encode($obj, JSON_PRETTY_PRINT), "\n";

print_r(json_decode($json, TRUE));

JSON和数组的输出如下,注意属性是其中的一部分:

{
    "items": {
        "item": [
            {
                "@attributes": {
                    "abc": "123"
                },
                "@text": "item one"
            },
            {
                "@attributes": {
                    "abc": "456"
                },
                "@text": "item two"
            }
        ]
    }
}
Array
(
    [items] => Array
        (
            [item] => Array
                (
                    [0] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 123
                                )

                            [@text] => item one
                        )

                    [1] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 456
                                )

                            [@text] => item two
                        )

                )

        )

)
于 2013-08-31T22:50:12.403 回答
0

这是我发现的一个类,它能够很好地将 XML 处理成数组:http: //outlandish.com/blog/xml-to-json/备份)。转换为 json 是一个json_encode()调用的问题。

于 2013-09-25T11:11:16.110 回答
0

虽然理论上可以编写从 XML 到 PHP 或 JSON 结构的通用转换,但很难捕捉到所有可能存在的细微差别 - 子元素和属性之间的区别、属性旁边的文本内容(如您在此处所见)或即使在子元素旁边,具有相同名称的多个子节点,子元素和文本节点的顺序是否重要(例如在 XHTML 或 DocBook 中)等等。

如果您有需要生成的特定格式,通常使用 API(如 SimpleXML)来循环 XML 并生成您需要的结构会容易得多。

您没有指定要实现的结构,但给出输入的一般方法是遍历每个项目,并访问已知属性或遍历每个属性:

$sxml = simplexml_load_string( $xml );
$final_array = array();
foreach ( $sxml->items->item as $xml_item )
{
    $formatted_item = array();

    // Text content of item
    $formatted_item['content'] = (string)$xml_item;

    // Specifically get 'abc' attribute
    $formatted_item['abc'] = (string)$xml_item['abc'];
    // Maybe one of the attributes is an integer
    $formatted_item['foo_id'] = (int)$xml_item['foo_id'];

    // Or maybe you want to loop over lots of possible attributes
    foreach ( $xml_item->attributes() as $attr_name => $attr_value )
    {
         $formatted_item['attrib:' . $attr_name] = (string)$attr_value;
    }

    // Add it to a final list
    $final_array[] = $formatted_item;
    // Or maybe you want that array to be keyed on one of the attributes
    $final_array[ (string)$xml_item['key'] ] = $formatted_item;
}
于 2013-08-31T17:46:09.047 回答