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

我有一个通过php创建的xml文件。基本结构是:

    <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)解决了我所有的问题。再次感谢。