我想显示xml内容,通过字段名称和值来区分文档,请提供任何帮助。下面是我的xml文件内容。
<doc>
<field name="id">1</field>
<field name="name">A</field>
<field name="sk">Acce</field>
<field name="level">Beginner</field>
<field name="do">Tuto</field>
<field name="open">1</field>
<field name="type">Ct</field>
<field name="extensis">cl_ex</field>
<field name="features">Atos</field>
<field name="downl"></field>
<field name="source">AtomicCounters</field>
<field name="description">Ths.</field>
<field name="tag1"></field>
<field name="tag2"></field>
<field name="tag3"></field>
<field name="tag4">Global</field>
<field name="tag5">Atomic</field>
<field name="tag6"></field>
<field name="tag7"></field>
<field name="tag8"></field>
<field name="tag9"></field>
<field name="tag10"></field>
</doc>
<doc>
<field name="id">2</field>
<field name="name">Ar</field>
<field name="sk">Acrce</field>
<field name="level">Beginner</field>
<field name="do">Tuto1</field>
<field name="open">11</field>
<field name="type">C1t</field>
<field name="extensis">cl_exd</field>
<field name="features">Atos</field>
<field name="downl"></field>
<field name="source">ddddd</field>
<field name="description">Thsdd.</field>
<field name="tag1"></field>
<field name="tag2"></field>
<field name="tag3"></field>
<field name="tag4">Global1</field>
<field name="tag5">Atomic1</field>
<field name="tag6"></field>
<field name="tag7"></field>
<field name="tag8"></field>
<field name="tag9"></field>
<field name="tag10"></field>
</doc>
下面是我正在使用的代码。
<?php
$result="";
$document = new DOMDocument();
//$document->load('/wamp/www/amd/261013/test/amd_one.xml');
$document->load('http://localhost/solr/select');
// this will also output doctype and comments at top level
foreach($document->childNodes as $node)
$result[] .= $document->saveXML($node)."'n";
//echo $result[];
foreach($result as $key => $value)
{
echo "$key - $value<br/>";
}
?>
但是它只是值...像 1 阿阿切....
我想要像 $field = id,$value = 1,$field = 名称,$value = A,$field = id,$value =2,$field = 名称,$value = Ar,..
请问任何建议..
这不是关于key
和value
,而是关于<field>
节点的name
属性及其值。
使用simplexml
的示例:
$xml = simplexml_load_string($x); // assume XML in $x
foreach ($xml->doc as $doc) {
foreach ($doc->field as $field) echo "$field[name]: $field <br />";
echo "------ <br />";
}
查看它的工作原理:http://codepad.viper-7.com/k3zg8I
您的代码中存在一些问题。首先,你真的不需要转换成一个(你可以,但为了开始工作,只做必要的事情)。还有一些我猜你不知道的要点,所以这里有一些关于你的代码的指示:
你写:
foreach ($document->childNodes as $node)
但实际上,到目前为止,您只对<doc>
元素感兴趣。让我们这样做:
foreach ($document->getElementsByTagName('doc') as $node)
此变体实际上只会为您提供您感兴趣的<doc>
元素 $node
.
然后你遇到的下一个问题是将<field>
(在我的答案中称为<str>
)元素及其name
属性和节点值转换为$key => $value
对。我想说这最好通过一些帮助映射功能来完成,这样您就可以更流畅地应用转换。让我们创建这样一个映射函数:
$keyValue = function (DOMElement $element)
{
return [
$element->getAttribute('name'), // key
trim($element->nodeValue), // value
];
};
这是一个小函数,它将DOMElement
对象转换为一个数组,其中键作为第一个条目(通过读出属性名称)和值作为第二个条目(通过读取节点值)。这是一个非常简单的功能。
此函数现在可以在$docs
元素的循环中应用,并进一步应用于所有子元素<str>
foreach ($document->getElementsByTagName('doc') as $node)
{
foreach ($node->getElementsByTagName('str') as $field)
{
list($key, $value) = $keyValue($field);
echo "'$key: $key - '$value: $value'n";
}
}
如此块所示,在迭代<doc>
元素后,您将迭代名为 <str>
的每个后代元素(在您的问题中<field>
)。将映射函数$keyValue()
应用到其中,并从映射函数返回值中获取$key
和$value
变量。
注意:如果您需要更具体的子节点遍历,请参阅 PHP DOMDocument 中的过滤子节点遍历和类似内容,以获取有关如何迭代
DOMNodeList
和朋友的更多想法。
让我们运行该示例来测试它是否有效:
1. Node:
========
$key: id - $value: 3
$key: name - $value: BinarySearch
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value:
...
2. Node:
========
$key: id - $value: 2
$key: name - $value: BasicDebug
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: Debug
...
3. Node:
========
$key: id - $value: 1
$key: name - $value: AtomicCounters
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: Tutorial
...
4. Node:
========
$key: id - $value: 4
$key: name - $value: BinomialOption
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: Financial Engineering
...
5. Node:
========
$key: id - $value: 5
$key: name - $value: BinomialOptionMultiGPU
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Financial Engineering
...
6. Node:
========
$key: id - $value: 6
$key: name - $value: BitonicSort
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: General
...
7. Node:
========
$key: id - $value: 7
$key: name - $value: BlackScholes
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Financial Engineering
...
8. Node:
========
$key: id - $value: 8
$key: name - $value: BlackScholesDP
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Financial Engineering
...
9. Node:
========
$key: id - $value: 9
$key: name - $value: BoxFilter
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Image Processing
...
10. Node:
========
$key: id - $value: 10
$key: name - $value: BoxFilterGL
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Image Processing
...
这看起来像您正在寻找的结果。下面是该示例中使用的确切代码:
<?php
/**
* How to display value with field names from Solr XML files, getting values only
*
* @link https://stackoverflow.com/q/19605287/367456
*/
$file = "solr.xml";
if (!file_exists($file))
{
$url = 'http://index.websolr.com/solr/15b84f04a7e/select';
$handle = fopen($url, 'r');
file_put_contents($file, $handle);
fclose($handle);
}
$document = new DOMDocument();
$document->load($file);
$keyValue = function (DOMElement $element)
{
return [
$element->getAttribute('name'), // key
trim($element->nodeValue), // value
];
};
foreach ($document->getElementsByTagName('doc') as $node)
{
foreach ($node->getElementsByTagName('str') as $field)
{
list($key, $value) = $keyValue($field);
echo "'$key: $key - '$value: $value'n";
}
}
foreach ($document->getElementsByTagName('doc') as $index => $node)
{
printf("%d. Node:'n========'n", $index + 1);
foreach ($node->getElementsByTagName('str') as $count => $field)
{
if ($count > 4)
{
echo "...'n";
break;
}
list($key, $value) = $keyValue($field);
echo "'$key: $key - '$value: $value'n";
}
}