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>