我有一个xml文件,它是通过php创建的。基本结构是:
<catgories> *this is root*
<category> *element*
<title>xy</title> *attribute*
<desc>yu</desc> *attribute*
<categoryLeaf> *child element of category*
<title>rt</title> *attribute of categoryLeaf*
</categoryLeaf>
<endtvod></endtvod>
</category>
</categories>xml是一次性创建的,但categoryLeaf和它的属性除外,这些属性是在一个单独的函数中创建的。xml是正确创建的。为了获得categoryLeaf,我正在解析一个html并提取信息,并将该信息存储在一个数组中:
if (!empty($dom)) { //IF NOT EMPTY FIND CATEGORIES
$clsort = $xpath->query('//div[@class="sort"]');
foreach($clsort as $clsorts){
$li= $clsorts->getElementsByTagName('li');
foreach ($li as $lis){
$links=$lis->getElementsByTagname('a');
foreach ($links as $link){
$href=$link->getAttribute('href');
$text=$link->nodeValue;
if ($text=="#"){
break;
}else{
$textarray=$text;
ECHO $textarray."<br>";
CategoryLeafXml($textarray);
}
}
}
}
}
else
{
echo "EMPTY CONTAINER". "<br>";
}通过上面的代码获得所需的信息并添加到textarray中。我可以回音,每个人都会出现。我将数组传递给一个函数,即打开xml,插入categoryLeaf和标题属性,并通过代码保存:
Function CategoryLeafXml($textarray){
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$xpath = new DOMXPath($xml);
$xml-> loadXML ('.\\xml\\test.xml');
$arrcount=count($textarray);
echo $arrcount."<br>";
$categoryLeaf=$xml->createElement("categoryLeaf");
for ($i=0; $i<$arrcount;$i++){
echo $textarray."<br>";
$endtvod=$xml->getElementsByTagName('endtvod')->item(0); //LOCATE tag
$category=$xml->getElementsByTagName('category');
$categories=$xml->getElementsByTagName('categories');
$newleaf=$xml->insertBefore($categoryLeaf, $endtvod);
$title = $xml->createAttribute("title");
$title->value= $textarray;
$categoryLeaf->appendChild($title);
$xml->save('.\\xml\\test.xml');
}
} 所要发生的是创建xml结构,将html解析为textarray,将textarray传递给在元素tvod之前插入元素categoryLeaf的函数。textarray是分类叶子/标题的属性值。我遇到了两个问题,(1)打开了xml并创建了categoryLeaf,但是保存后的结果是:
<?xml version="1.0" encoding="UTF-8"?>
<categoryLeaf title="value of textarray"/>xml被覆盖,只剩下一个插入的元素和最后一个数组值。(2)数组计数总是显示1,for循环只运行一次,只写数组的最后一个值。我预期会为数组计数的值添加一个categoryLeaf,但它只是将该值视为一个值。我知道数组中大约有25个条目。
发布于 2015-03-15 19:04:31
您只需要通过以下方法创建一个categoryLeaf节点:
$categoryLeaf=$xml->createElement("categoryLeaf")并更改属性n次。
您必须在for循环中创建categoryLeaf。
我也不明白你为什么要这样做:
$category=$xml->getElementsByTagName('category');
$categories=$xml->getElementsByTagName('categories');这在函数内部似乎没有做任何事情。
就试试这样的东西:
Function CategoryLeafXml($textarray){
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$xpath = new DOMXPath($xml);
$xml-> loadXML ('.\\xml\\test.xml');
$endtvod = $xml->getElementsbyTagName('endtvod')->item(0)
foreach ($textarray as $text){
$categoryLeaf=$xml->createElement("categoryLeaf");
$categoryLeaf->setAttribute('title', $text);
$endtvod->parentNode->insertBefore($categoryLeaf, $enttvod)
}
$xml->save('.\\xml\\test.xml');
}https://stackoverflow.com/questions/29063308
复制相似问题