PHP保存XML和数组
我有一个通过php创建的xml文件。基本结构是:PHP保存XML和数组,php,arrays,xml,Php,Arrays,Xml,我有一个通过php创建的xml文件。基本结构是: <catgories> *this is root* <category> *element* <title>xy</title> *attribute* <desc>yu</desc> *attribute* <categoryLeaf&g
<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>
*这是根目录*
*元素*
xy*属性*
yu*属性*
*范畴的子元素*
categoryLeaf的rt*属性*
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>";
}
if(!empty($dom)){//if非空查找类别
$clsort=$xpath->query('//div[@class=“sort”]');
foreach($clsort as$clsorts){
$li=$clsorts->getElementsByTagName('li');
foreach($li作为$lis){
$links=$lis->getElementsByTagname('a');
foreach($links作为$link){
$href=$link->getAttribute('href');
$text=$link->nodeValue;
如果($text==“#”){
打破
}否则{
$textarray=$text;
ECHO$textary。“
”;
CategoryLeafXml($textarray);
}
}
}
}
}
其他的
{
回显“空容器”。
;
}
所需信息通过上述代码获得,并添加到textarray中。我可以回音,每个人都出现了。我将数组传递给一个函数,该函数用于打开xml,插入categoryLeaf以及title属性并通过代码保存:
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');
}
}
Function CategoryLeafXml($textarray){
$xml=新的DOMDocument('1.0','UTF-8');
$xml->formatOutput=true;
$xpath=newdomxpath($xml);
$xml->loadXML('.\\xml\\test.xml');
$arrcount=count($textarray);
echo$arrcount.“
”;
$categoryLeaf=$xml->createElement(“categoryLeaf”);
对于($i=0;$igetElementsByTagName('endtvod')->项(0);//定位标记
$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传递给函数,在该函数中,元素categoryLeaf插入到元素tvod之前。textarray是categoryLeaf/title的属性值。我有两个问题,(1)打开xml并创建categoryLeaf,但保存后的结果是:
<?xml version="1.0" encoding="UTF-8"?>
<categoryLeaf title="value of textarray"/>
xml被覆盖,只留下一个插入的元素和最后一个数组值。
(2) 数组计数始终显示为1,for循环只运行一次,只写入数组的最后一个值。我预计会为数组计数的值添加categoryLeaf,但它只看到该值为1。我知道数组中大约有25个条目。您仅通过以下方式创建一个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');
}
你确定test.xml文件加载正确吗?如果我注释掉为categoryLeaf创建insert和attributes的代码,但保留$xml->save,则查看时test.xml文件仍然完好无损。我还以为是从另一个测试中得到的,看起来它只使用.Well,get(1)保存xml空白将两个函数合并为一个函数修复了此问题,因此创建了xml并同时添加了categoryleaf。在获取要传递的数组项总数时仍然存在问题。仅获取最后一个。感谢您的关注。我已经解决了问题,您是对的。您指出的两行没有做任何事情,实际上忘记了删除它们。我剩下的问题是将$text存储到数组中。我让它循环n次并创建了那么多categoryleaf元素,但该值只给了我“数组”。我收到错误消息Uninitialized string offset:非常感谢,foreach($textarray)解决了我所有的问题。再次感谢。