Php 如何使用CURL和DOM将xml文件中的所有元素放入数组中?
我需要一些代码方面的帮助。我想将xml文件中的所有元素与CURL和DOM一起放入数组中 你能帮我吗 My PHP with CURL代码如下所示: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: '
<?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 & Camisoles</dispEngNm>
<dispNm>Tanks & 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 & Camisoles</dispEngNm>
<dispNm>Tanks & 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 & Camisoles</dispEngNm>
<dispNm>Tanks & 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 & Camisoles</dispEngNm>
<dispNm>Tanks & 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);
主要区别在于,如果读取泛型转换的结果,数组键可能具有不同的名称,或者可能丢失。结果结构直接取决于输入。如果您将数据读入特定结构(如我的示例),您就知道