PHP的XML DOM未捕获的异常'DOMException'与消息'错误的文档错误'

问题描述:

我想学习XML,我知道这是一个问题,没有正确导入节点。但我无法弄清楚。我一直在环顾四周,大多数人没有像我对部门那样的多个子元素。PHP的XML DOM未捕获的异常'DOMException'与消息'错误的文档错误'

这里是我的XML结构:

<SOT> 
    <DEPARTMENT name="Aviation Technology" id="AT"> 
     <EMPLOYEE type="Faculty"> 
      <LOGIN>jdoe1</LOGIN> 
      <NAME>John Doe</NAME> 
     </EMPLOYEE> 

     <EMPLOYEE type="Faculty"> 
      <LOGIN>jdoe2</LOGIN> 
      <NAME>Jane Doe</NAME> 
     </EMPLOYEE> 

     <EMPLOYEE type="Faculty"> 
      <LOGIN>jdoe3</LOGIN> 
      <NAME>Joe Doe</NAME> 
     </EMPLOYEE> 
    </DEPARTMENT>  

    <DEPARTMENT name="Building and Construction Management" id="BCM"> 
    </DEPARTMENT> 

    <DEPARTMENT name="Computer Graphics Technology" id="CGT"> 
    </DEPARTMENT> 
</SOT> 

我明白,SOT是我的根元素以及部门SOT的“孩子”,并且每个部门有多个员工的“孩子”。我遇到的问题是当我尝试向某个部门添加新员工时。当我尝试$departmentArray->item($i)->appendChild($employee);时,出现错误的文档错误。

我使用这个PHP代码尝试和孩子追加到departmentNode

<?php 

    //grab form data 
    $username = $_POST['username']; 
    $employeeName = $_POST['employeeName']; 
    $department = $_POST['department']; 

    //create new DOMDocument to hold current XML data 
    $doc = new DOMDocument(); 
    $doc->load("test.xml"); 
    $xpath = new DOMXpath($doc); 

    //create our new DOMDocument for combining the XML data 
    $newDoc = new DOMDocument(); 
    $newDoc->preserveWhiteSpace = false; 

    //create School of Tech Node and append to new doc 
    $sotElement = $newDoc->createElement("SOT"); 
    $newDoc->appendChild($sotElement); 
    $root = $newDoc->documentElement; 

    //grab the department Nodes 
    $departmentArray = $doc->getElementsByTagName("DEPARTMENT"); 

    //create a new employee and set attribute to faculty 
    $employee = $newDoc->createElement("EMPLOYEE"); 
    $employee->setAttribute("type", "Faculty"); 

    //counters (might use them later for ->item(counter) function 
    $indexCounter = 0; 
    $i = 0; 

    foreach($departmentArray as $departmentNode){ 
     if(strcmp($departmentNode->getAttribute('name'),$department) == 0){//check if departments match 
      //create login element 
      $loginNode = $newDoc->createElement("LOGIN"); 
      $loginNode->appendChild($newDoc->createTextNode($username)); 
      $employee->appendChild($loginNode); 

      //create name node 
      $nameNode = $newDoc->createElement("NAME"); 
      $nameNode->appendChild($newDoc->createTextNode($employeeName)); 
      $employee->appendChild($nameNode); 

      //append employee onto department node 
      //$departmentArray->item($i) = $doc->importNode($departmentArray->item($i), true); 
      $departmentArray->item($i)->appendChild($employee); 

      //set index of department array (possibly used for appending later) 
      $indexCounter = $i; 
     } 
     $i++; 
    } 

    ####################################### 
    /*Write out data to XML file   */ 
    ####################################### 
    //$departmentArray = $doc->getElementsByTagName("DEPARTMENT"); 
    foreach($departmentArray as $departmentNode){ 
     $tempNode = $newDoc->importNode($departmentNode, true); 
     /*if(strcmp($departmentNode->getAttribute('name'),$department) == 0){ 
      $sotElement->appendChild($employee); 

     }*/ 
     $sotElement->appendChild($tempNode); 
    } 

    $newDoc->formatOutput = true; 
    $newDoc->save("test2.xml"); 


?> 

任何解释如何正确导入所有的部门节点可以追加到他们将不胜感激帮助。我试过使用数组。

您需要导入任何节点到它的另一个文件附加到

$departmentArray->item($i)->appendChild($doc->importNode($employee, true)); 
+0

这是因为departmentArray目前是原来的$ doc和不$ newDoc里面?谢谢您的帮助! – Grant 2011-04-26 00:15:06

+0

是的,这就是原因。 – SteAp 2011-04-26 18:28:18

+0

importNode的第二个参数很重要。默认情况下是false,不会导入孩子。 – jenkin90 2014-11-25 13:20:57

我很确定发生这种情况,因为您试图将来自不同文档的元素附加到输出文档中。

我在php的网站上发现这个代码in a comment对于DOMNode::cloneNode这可能是你想要的。

<?php 
    $dom1->documentElement->appendChild( 
     $dom1->importNode($dom2->documentElement, true) 
    ); 
?> 

或者,你可以看看出口节点的XML,并将其重新导入到DOMDocumentFragment,但我不得不尝试着去知道。