首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP保存XML和数组

PHP保存XML和数组
EN

Stack Overflow用户
提问于 2015-03-15 16:45:03
回答 1查看 334关注 0票数 1

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

代码语言:javascript
复制
    <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并提取信息,并将该信息存储在一个数组中:

代码语言:javascript
复制
      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和标题属性,并通过代码保存:

代码语言:javascript
复制
             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,但是保存后的结果是:

代码语言:javascript
复制
      <?xml version="1.0" encoding="UTF-8"?>
      <categoryLeaf title="value of textarray"/>

xml被覆盖,只剩下一个插入的元素和最后一个数组值。(2)数组计数总是显示1,for循环只运行一次,只写数组的最后一个值。我预期会为数组计数的值添加一个categoryLeaf,但它只是将该值视为一个值。我知道数组中大约有25个条目。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 19:04:31

您只需要通过以下方法创建一个categoryLeaf节点:

代码语言:javascript
复制
$categoryLeaf=$xml->createElement("categoryLeaf")

并更改属性n次。

您必须在for循环中创建categoryLeaf。

我也不明白你为什么要这样做:

代码语言:javascript
复制
$category=$xml->getElementsByTagName('category');
$categories=$xml->getElementsByTagName('categories');

这在函数内部似乎没有做任何事情。

就试试这样的东西:

代码语言:javascript
复制
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'); 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29063308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档