2011-04-25 6 views
11

Estoy tratando de aprender XML y sé que esto es un problema de no importar correctamente los nodos. Pero no puedo entenderlo. He estado mirando alrededor y la mayoría de las personas no tienen elementos secundarios múltiples como hago con los departamentos.PHP XML DOM no detectada excepción 'DOMException' con el mensaje 'incorrecto documento de error'

Aquí está mi estructura 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> 

entiendo que SOT es mi elemento raíz y que los departamentos son "hijos" de SOT y cada departamento tiene varios empleados "niños". El problema que encuentro es cuando intento agregar un nuevo empleado a un determinado departamento. Cuando intento $departmentArray->item($i)->appendChild($employee); obtengo el error de documento incorrecto.

estoy usando el código PHP para tratar de anexar el niño al 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"); 


?> 

Cualquier ayuda que explica cómo importar correctamente todos los nodos de departamentos para poder añadir en ellos sería muy apreciada. He intentado usar matrices.

Respuesta

16

necesita importar cualquier nodo a añadir a otra documento:

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

Se debe esto a la departmentArray se encuentra actualmente en el interior de la $ doc original y no $ newDoc? ¡Gracias por la ayuda! – Grant

+0

Sí, esa es la razón. – SteAp

+0

Es importante el segundo parámetro de importNode. Por defecto es falso y no importa los elementos secundarios. – jenkin90

9

Estoy bastante seguro de que esto está sucediendo porque usted está tratando de agregar un elemento de un documento diferente en el documento de salida.

Encontré este código in a comment en el sitio de php para DOMNode::cloneNode que podría ser lo que usted desea.

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

Alternativamente, usted podría mirar a la exportación de XML del nodo y volver a importar en un DOMDocumentFragment, pero tendría que experimentar para saber con seguridad.

Cuestiones relacionadas