XML Split Node attivo. valore

Ho usato SO per molti anni e ho sempre trovato una risposta, ma questa volta mi sono perso bene e veramente.

Ho un file xml vorrei dividere la compatibilità in xml ben formato

`<product> <item> <partno>abc123</partno> <Compatbility>model1: 110C, 115C, 117C. model2: 1835C, 1840C. model3: 210C, 215C, 3240C.</Compatbility> </item> </product>` 

In Compatibilità il model di parole cambia con each voce di voce sebbene il model: after sia sempre lì così come lo è. dopo each gruppo di templates.

Dovrei usare SimpleXml DomXml o un xpath per get il seguente risultato

 `<product> <item> <partno>abc123</partno> <Compatbility> <model>model1: 110C, 115C, 117C.</model> <model>model2: 1835C, 1840C.</model> <model>model3: 210C, 215C, 3240C.</model> </Compatbility> </item> </product>` 

Grazie

Prima di tutto, devi prima convertirlo in qualcosa che puoi manipolare (arrays). Quindi il solito parsing (usando esplode). Alla fine, dovrai creare nuovamente un nuovo xml. Considera questo esempio:

 $xml_string = '<product><item><partno>abc123</partno><Compatbility>model1: 110C, 115C, 117C. model2: 1835C, 1840C. model3: 210C, 215C, 3240C.</Compatbility></item></product>'; $original_xml = simplexml_load_string($xml_string); $data = json_decode(json_encode($original_xml), true); $compatbility = $data['item']['Compatbility']; // get all compatibility values // explode values $compatbility = arrays_filter(arrays_map('trim', explode('.', $compatbility))); $new_xml = new SimpleXMLElement('<product/>'); // initialize new xml // add necessary values $new_xml->addChild('item')->addChild('partno', $data['item']['partno']); $new_xml->item->addChild('Compatbility'); // loop the values and add them as children foreach($compatbility as $value) { $value = trim(preg_replace('/(\w+):/', '', $value)); $new_xml->item->Compatbility->addChild('model', $value); } echo $new_xml->asXML(); // output as xml 

Per simplexml, è ansible eseguire un'espressione regolare corrispondente sul valore di text di un elemento.

È quindi ansible rimuovere tutto il text interno e aggiungere il risultato analizzato come nuovi elementi figlio.

Questo può essere fatto con tutto ciò che hai detto: DOMDocument, SimpleXMLElement – entrambi con o senza xpath.

Ecco un esempio commentato in SimpleXML ( demo online ):

 <?php /** * @link http://stackoverflow.com/q/24304095/367456 * @link https://eval.in/164934 */ $buffer = <<<XML <product> <item> <partno>abc123</partno> <Compatbility>model1: 110C, 115C, 117C. model2: 1835C, 1840C. model3: 210C, 215C, 3240C.</Compatbility> </item> </product> XML; # load the xml string $xml = simplexml_load_string($buffer); # obtain the element in question $compatbility = $xml->item->Compatbility; # parse it's inner text-value for the models by a regex $pattern = '~(model\\d?: [^.]+\\.) ?~u'; $result = preg_match_all($pattern, $compatbility, $matches); # remove the text (so called simplexml self-reference) $compatbility->{0} = ''; # add the parsed models as new model elements foreach ($matches[1] as $model) { $compatbility->model[] = $model; } # output the xml $xml->asXML('php://output'); 

L'output che dà è:

 <?xml version="1.0"?> <product> <item> <partno>abc123</partno> <Compatbility><model>model1: 110C, 115C, 117C.</model><model>model2: 1835C, 1840C.</model><model>model3: 210C, 215C, 3240C.</model></Compatbility> </item> </product>