Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用CURL和DOM将xml文件中的所有元素放入数组中?_Php_Arrays_Xml_Curl_Dom - Fatal编程技术网

Php 如何使用CURL和DOM将xml文件中的所有元素放入数组中?

Php 如何使用CURL和DOM将xml文件中的所有元素放入数组中?,php,arrays,xml,curl,dom,Php,Arrays,Xml,Curl,Dom,我需要一些代码方面的帮助。我想将xml文件中的所有元素与CURL和DOM一起放入数组中 你能帮我吗 My PHP with CURL代码如下所示: <?php $key = 'ad12rqwagst3ewtgsdhdsdsfsdgsd'; $url = 'http://api.11street.my/rest/cateservice/category'; $request_body = 'xml data'; $headers = array( 'openapikey: '

我需要一些代码方面的帮助。我想将xml文件中的所有元素与CURL和DOM一起放入数组中

你能帮我吗

My PHP with CURL代码如下所示:

<?php

$key = 'ad12rqwagst3ewtgsdhdsdsfsdgsd';

$url = 'http://api.11street.my/rest/cateservice/category';

$request_body = 'xml data';

$headers = array(
    'openapikey: ' . $key,
    'Accept-Charset: utf-8',
    'Content-Type: application/xml'
);

$curl = curl_init($url);

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($curl);
$arrXml = array();
$dom = new DOMDocument;
$dom->loadXML($result);

foreach ($dom->getElementsByTagName('dispEngNm') as $item) {
    $arrXml[] = $dom->saveXML($item) . "<br>" . "<hr>";
} 

print_r($arrXml);

?>
我只能将元素“dispEngNm”放入数组中。有人知道如何将其他元素“dispNm”、“dispNo”、“parentDispNo”和“dispEngNm”一起放入数组中吗

谢谢你的帮助!祝你有一个愉快的一天

只需更改此代码:

foreach ($dom->getElementsByTagName('dispEngNm') as $item) {
    $arrXml[] = $dom->saveXML($item) . "<br>" . "<hr>";
}
$allTags = $dom->getElementsByTagName('ns2:category');
for ($i =0; $i < $allTags.length; $i++) {
    $childLen = $allTags[i].childNodes.length;
    $innerChilds = $allTags[i].firstChild;
    for ($j = 0; $j < $childLen; $j++) {
        $arrXml[] = $dom->saveXML($innerChilds.innerHTML) . "<br>" . "<hr>"; 
        $innerChilds = $innerChilds.nextSibling;
    }
}
foreach($dom->getElementsByTagName('dispEngNm')作为$item){
$arrXml[]=$dom->saveXML($item)。“

”; }
根据该守则:

foreach ($dom->getElementsByTagName('dispEngNm') as $item) {
    $arrXml[] = $dom->saveXML($item) . "<br>" . "<hr>";
}
$allTags = $dom->getElementsByTagName('ns2:category');
for ($i =0; $i < $allTags.length; $i++) {
    $childLen = $allTags[i].childNodes.length;
    $innerChilds = $allTags[i].firstChild;
    for ($j = 0; $j < $childLen; $j++) {
        $arrXml[] = $dom->saveXML($innerChilds.innerHTML) . "<br>" . "<hr>"; 
        $innerChilds = $innerChilds.nextSibling;
    }
}
$allTags=$dom->getElementsByTagName('ns2:category');
对于($i=0;$i<$allTags.length;$i++){
$childLen=$allTags[i].childNodes.length;
$innerChilds=$allTags[i].firstChild;
对于($j=0;$j<$childLen;$j++){
$arrXml[]=$dom->saveXML($innerChilds.innerHTML)。“

”; $innerChilds=$innerChilds.nextSibling; } }
在上面的代码中,我只是加载了
ns2:category
的所有子节点,这可能会起作用

注意:我没有测试代码。您可以对此进行测试,并在需要时进行更改。

只需更改此代码:

foreach ($dom->getElementsByTagName('dispEngNm') as $item) {
    $arrXml[] = $dom->saveXML($item) . "<br>" . "<hr>";
}
$allTags = $dom->getElementsByTagName('ns2:category');
for ($i =0; $i < $allTags.length; $i++) {
    $childLen = $allTags[i].childNodes.length;
    $innerChilds = $allTags[i].firstChild;
    for ($j = 0; $j < $childLen; $j++) {
        $arrXml[] = $dom->saveXML($innerChilds.innerHTML) . "<br>" . "<hr>"; 
        $innerChilds = $innerChilds.nextSibling;
    }
}
foreach($dom->getElementsByTagName('dispEngNm')作为$item){
$arrXml[]=$dom->saveXML($item)。“

”; }
根据该守则:

foreach ($dom->getElementsByTagName('dispEngNm') as $item) {
    $arrXml[] = $dom->saveXML($item) . "<br>" . "<hr>";
}
$allTags = $dom->getElementsByTagName('ns2:category');
for ($i =0; $i < $allTags.length; $i++) {
    $childLen = $allTags[i].childNodes.length;
    $innerChilds = $allTags[i].firstChild;
    for ($j = 0; $j < $childLen; $j++) {
        $arrXml[] = $dom->saveXML($innerChilds.innerHTML) . "<br>" . "<hr>"; 
        $innerChilds = $innerChilds.nextSibling;
    }
}
$allTags=$dom->getElementsByTagName('ns2:category');
对于($i=0;$i<$allTags.length;$i++){
$childLen=$allTags[i].childNodes.length;
$innerChilds=$allTags[i].firstChild;
对于($j=0;$j<$childLen;$j++){
$arrXml[]=$dom->saveXML($innerChilds.innerHTML)。“

”; $innerChilds=$innerChilds.nextSibling; } }
在上面的代码中,我只是加载了
ns2:category
的所有子节点,这可能会起作用


注意:我没有测试代码。您可以对此进行测试并在需要时进行更改。

结合到目前为止的代码,并使用SimpleXML的功能轻松迭代子元素,下面的代码首先查找
元素(
getElementsByTagName()
不担心名称空间),然后将其导入SimpleXML,这样您就可以对子元素执行
foreach()
,并将它们添加到工作数组中(使用标记名作为键)。这只是将所有子数据复制到关联数组中

$dom = new DOMDocument;
$dom->loadXML($result);

foreach ($dom->getElementsByTagName('category') as $item) {
    $sxml = simplexml_import_dom($item);
    $newData = [];
    foreach ( $sxml as $tag => $value ) {
        $newData[$tag] = (string)$value;
    }
    $arrXml[] = $newData;
}

print_r($arrXml);

Array
(
    [0] => Array
        (
            [depth] => 1
            [dispEngNm] => Women Clothing
            [dispNm] => Women Clothing
            [dispNo] => 2021
            [parentDispNo] => 0
        )

    [1] => Array
        (
            [depth] => 2
            [dispEngNm] => Women Tops
            [dispNm] => Women Tops
            [dispNo] => 2051
            [parentDispNo] => 2021
        )

    [2] => Array
        (
            [depth] => 3
            [dispEngNm] => Tanks & Camisoles
            [dispNm] => Tanks & Camisoles
            [dispNo] => 2209
            [parentDispNo] => 2051
        )

)

下面的代码结合到目前为止的代码,并使用SimpleXML轻松迭代子元素的功能,首先查找
元素(
getElementsByTagName()
不担心名称空间),然后将其导入SimpleXML,这样您就可以
foreach()
覆盖子元素,并将它们添加到工作数组中(使用标记名作为键)。这只是将所有子数据复制到关联数组中

$dom = new DOMDocument;
$dom->loadXML($result);

foreach ($dom->getElementsByTagName('category') as $item) {
    $sxml = simplexml_import_dom($item);
    $newData = [];
    foreach ( $sxml as $tag => $value ) {
        $newData[$tag] = (string)$value;
    }
    $arrXml[] = $newData;
}

print_r($arrXml);

Array
(
    [0] => Array
        (
            [depth] => 1
            [dispEngNm] => Women Clothing
            [dispNm] => Women Clothing
            [dispNo] => 2021
            [parentDispNo] => 0
        )

    [1] => Array
        (
            [depth] => 2
            [dispEngNm] => Women Tops
            [dispNm] => Women Tops
            [dispNo] => 2051
            [parentDispNo] => 2021
        )

    [2] => Array
        (
            [depth] => 3
            [dispEngNm] => Tanks & Camisoles
            [dispNm] => Tanks & Camisoles
            [dispNo] => 2209
            [parentDispNo] => 2051
        )

)

也许您正在查找
childNodes
属性

$arrXml = array();
foreach($dom->getElementsByTagName("category") as $cat){
    $curr=array();
    foreach($cat->childNodes as $child){
            $curr[$child->nodeName]=$dom->saveXML($child);
    }
    $arrXml[]=$curr;
}
unset($cat,$curr,$child);
print_r($arrXml);
工作示例:

<?php

$xml=<<<'XML'
<ns2:category>
    <depth>1</depth>
    <dispEngNm>Women Clothing</dispEngNm>
    <dispNm>Women Clothing</dispNm>
    <dispNo>2021</dispNo>
    <parentDispNo>0</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>2</depth>
    <dispEngNm>Women Tops</dispEngNm>
    <dispNm>Women Tops</dispNm>
    <dispNo>2051</dispNo>
    <parentDispNo>2021</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>3</depth>
    <dispEngNm>Tanks &amp; Camisoles</dispEngNm>
    <dispNm>Tanks &amp; Camisoles</dispNm>
    <dispNo>2209</dispNo>
    <parentDispNo>2051</parentDispNo>
</ns2:category>
XML;
$dom = new DOMDocument;
@$dom->loadHTML($xml);
$arrXml = array();
foreach($dom->getElementsByTagName("category") as $cat){
    $curr=array();
    foreach($cat->childNodes as $child){
            $curr[$child->nodeName]=$dom->saveXML($child);
    }
    $arrXml[]=$curr;
}
unset($cat,$curr,$child);
print_r($arrXml);

相反,它将包含子对象的文本,而不是xml

顺便说一句,上面的示例代码和textContent补丁的输出如下:

Array
(
    [0] => Array
        (
            [depth] => 1
            [dispengnm] => Women Clothing
            [dispnm] => Women Clothing
            [dispno] => 2021
            [parentdispno] => 0
        )

    [1] => Array
        (
            [depth] => 2
            [dispengnm] => Women Tops
            [dispnm] => Women Tops
            [dispno] => 2051
            [parentdispno] => 2021
        )

    [2] => Array
        (
            [depth] => 3
            [dispengnm] => Tanks & Camisoles
            [dispnm] => Tanks & Camisoles
            [dispno] => 2209
            [parentdispno] => 2051
        )

)

也许您正在查找
childNodes
属性

$arrXml = array();
foreach($dom->getElementsByTagName("category") as $cat){
    $curr=array();
    foreach($cat->childNodes as $child){
            $curr[$child->nodeName]=$dom->saveXML($child);
    }
    $arrXml[]=$curr;
}
unset($cat,$curr,$child);
print_r($arrXml);
工作示例:

<?php

$xml=<<<'XML'
<ns2:category>
    <depth>1</depth>
    <dispEngNm>Women Clothing</dispEngNm>
    <dispNm>Women Clothing</dispNm>
    <dispNo>2021</dispNo>
    <parentDispNo>0</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>2</depth>
    <dispEngNm>Women Tops</dispEngNm>
    <dispNm>Women Tops</dispNm>
    <dispNo>2051</dispNo>
    <parentDispNo>2021</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>3</depth>
    <dispEngNm>Tanks &amp; Camisoles</dispEngNm>
    <dispNm>Tanks &amp; Camisoles</dispNm>
    <dispNo>2209</dispNo>
    <parentDispNo>2051</parentDispNo>
</ns2:category>
XML;
$dom = new DOMDocument;
@$dom->loadHTML($xml);
$arrXml = array();
foreach($dom->getElementsByTagName("category") as $cat){
    $curr=array();
    foreach($cat->childNodes as $child){
            $curr[$child->nodeName]=$dom->saveXML($child);
    }
    $arrXml[]=$curr;
}
unset($cat,$curr,$child);
print_r($arrXml);

相反,它将包含子对象的文本,而不是xml

顺便说一句,上面的示例代码和textContent补丁的输出如下:

Array
(
    [0] => Array
        (
            [depth] => 1
            [dispengnm] => Women Clothing
            [dispnm] => Women Clothing
            [dispno] => 2021
            [parentdispno] => 0
        )

    [1] => Array
        (
            [depth] => 2
            [dispengnm] => Women Tops
            [dispnm] => Women Tops
            [dispno] => 2051
            [parentdispno] => 2021
        )

    [2] => Array
        (
            [depth] => 3
            [dispengnm] => Tanks & Camisoles
            [dispnm] => Tanks & Camisoles
            [dispno] => 2209
            [parentdispno] => 2051
        )

)

将通用转换为数组是可能的,但大多数情况下,您只是丢失了功能和数据。DOM包含Xpath,因此在大多数情况下,直接将数据读入特定的数组/对象结构更有意义。在本例中,您有一个具有父子关系的记录列表

您的XML包含名称空间前缀ns2,但缺少该前缀的定义。查找属性
xmlns:ns2
——其值为实际名称空间

$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:categorys xmlns:ns2="urn:ns2">
<ns2:category>
    <depth>1</depth>
    <dispEngNm>Women Clothing</dispEngNm>
    <dispNm>Women Clothing</dispNm>
    <dispNo>2021</dispNo>
    <parentDispNo>0</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>2</depth>
    <dispEngNm>Women Tops</dispEngNm>
    <dispNm>Women Tops</dispNm>
    <dispNo>2051</dispNo>
    <parentDispNo>2021</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>3</depth>
    <dispEngNm>Tanks &amp; Camisoles</dispEngNm>
    <dispNm>Tanks &amp; Camisoles</dispNm>
    <dispNo>2209</dispNo>
    <parentDispNo>2051</parentDispNo>
</ns2:category>
</ns2:categorys>
XML;

// this needs to be the value of the xmlns:ns2 attribute
$ns_categories = 'urn:ns2';

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
// register an prefix for the namespace
$xpath->registerNamespace('c', $ns_categories);

$categories = [];
$tree = [];
// iterate the categories
foreach ($xpath->evaluate('//c:categorys/c:category') as $category) {
    // casting a node list in Xpath will return the content of the first node
    $id = (int)$xpath->evaluate('number(dispNo)', $category);
    $parentId = (int)$xpath->evaluate('number(parentDispNo)', $category);
    // store category data 
    $categories[$id] = [
        'id' => $id,
        'parent_id' => $parentId,
        'depth' => (int)$xpath->evaluate('number(depth)', $category),
        'caption' => $xpath->evaluate('string(dispNm)', $category),
        'caption_english' => $xpath->evaluate('string(dispEngNm)', $category),
    ];
    // store child ids for each parent 
    if (!isset($tree[$parentId])) {
      $tree[$parentId] = [];
    }
    $tree[$parentId][] = $id; 
}

var_dump($categories, $tree);   
$xml=$id,
'parent_id'=>$parentId,
'depth'=>(int)$xpath->evaluate('number(depth)',$category),
'caption'=>$xpath->evaluate('string(dispNm)'$category),
'caption_english'=>$xpath->evaluate('string(dispEngNm)',$category),
];
//存储每个父项的子ID
如果(!isset($tree[$parentId])){
$tree[$parentId]=[];
}
$tree[$parentId][]=$id;
}
变量转储($categories,$tree);

主要区别在于,如果读取泛型转换的结果,数组键可能具有不同的名称,或者可能丢失。结果结构直接取决于输入。如果将数据读入一个特定的结构(如我的示例),您就知道其中有哪些数组键。

将数据转换为数组是可能的,但大多数情况下,您只是丢失了特性和数据。DOM包含Xpath,因此在大多数情况下,直接将数据读入特定的数组/对象结构更有意义。在本例中,您有一个具有父子关系的记录列表

您的XML包含名称空间前缀ns2,但缺少该前缀的定义。查找属性
xmlns:ns2
——其值为实际名称空间

$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:categorys xmlns:ns2="urn:ns2">
<ns2:category>
    <depth>1</depth>
    <dispEngNm>Women Clothing</dispEngNm>
    <dispNm>Women Clothing</dispNm>
    <dispNo>2021</dispNo>
    <parentDispNo>0</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>2</depth>
    <dispEngNm>Women Tops</dispEngNm>
    <dispNm>Women Tops</dispNm>
    <dispNo>2051</dispNo>
    <parentDispNo>2021</parentDispNo>
</ns2:category>
<ns2:category>
    <depth>3</depth>
    <dispEngNm>Tanks &amp; Camisoles</dispEngNm>
    <dispNm>Tanks &amp; Camisoles</dispNm>
    <dispNo>2209</dispNo>
    <parentDispNo>2051</parentDispNo>
</ns2:category>
</ns2:categorys>
XML;

// this needs to be the value of the xmlns:ns2 attribute
$ns_categories = 'urn:ns2';

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
// register an prefix for the namespace
$xpath->registerNamespace('c', $ns_categories);

$categories = [];
$tree = [];
// iterate the categories
foreach ($xpath->evaluate('//c:categorys/c:category') as $category) {
    // casting a node list in Xpath will return the content of the first node
    $id = (int)$xpath->evaluate('number(dispNo)', $category);
    $parentId = (int)$xpath->evaluate('number(parentDispNo)', $category);
    // store category data 
    $categories[$id] = [
        'id' => $id,
        'parent_id' => $parentId,
        'depth' => (int)$xpath->evaluate('number(depth)', $category),
        'caption' => $xpath->evaluate('string(dispNm)', $category),
        'caption_english' => $xpath->evaluate('string(dispEngNm)', $category),
    ];
    // store child ids for each parent 
    if (!isset($tree[$parentId])) {
      $tree[$parentId] = [];
    }
    $tree[$parentId][] = $id; 
}

var_dump($categories, $tree);   
$xml=$id,
'parent_id'=>$parentId,
'depth'=>(int)$xpath->evaluate('number(depth)',$category),
'caption'=>$xpath->evaluate('string(dispNm)'$category),
'caption_english'=>$xpath->evaluate('string(dispEngNm)',$category),
];
//存储每个父项的子ID
如果(!isset($tree[$parentId])){
$tree[$parentId]=[];
}
$tree[$parentId][]=$id;
}
变量转储($categories,$tree);
主要区别在于,如果读取泛型转换的结果,数组键可能具有不同的名称,或者可能丢失。结果结构直接取决于输入。如果您将数据读入特定结构(如我的示例),您就知道