Php 上的XML拆分节点。价值

Php 上的XML拆分节点。价值,php,xml,dom,simplexml,Php,Xml,Dom,Simplexml,我用了这么多年,总是能找到答案,但这次我完全迷失了方向 我有一个xml文件,我想将兼容性拆分为格式良好的xml `<product> <item> <partno>abc123</partno> <Compatbility>model1: 110C, 115C, 117C. model2: 1835C, 1840C. model3: 210C, 215C, 3240C.</Compatbility> </item>

我用了这么多年,总是能找到答案,但这次我完全迷失了方向

我有一个xml文件,我想将兼容性拆分为格式良好的xml

`<product>
<item>
<partno>abc123</partno>
<Compatbility>model1: 110C, 115C, 117C. model2: 1835C, 1840C. model3: 210C, 215C, 3240C.</Compatbility>
</item>
</product>`
`
abc123
型号1:110C、115C、117C。模型2:1835C,1840C。型号3:210C、215C、3240C。
`
在兼容性方面,单词model随每个条目而变化,尽管:after模型和。每个模型组之后

我应该使用SimpleXml或xpath来获得以下结果吗

`<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>`
`
abc123
型号1:110C、115C、117C。
模型2:1835C,1840C。
型号3:210C、215C、3240C。
`

当然,首先要感谢您,您需要将第一个转换为您可以操作的东西(数组)。然后是通常的解析(使用explode)。最后,您需要再次创建一个新的xml。考虑这个例子:

$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 = array_filter(array_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
$xml_string='abc123model1:110C、115C、117C。模型2:1835C,1840C。型号3:210C、215C、3240C;
$original\u xml=simplexml\u load\u string($xml\u string);
$data=json_decode(json_encode($original_xml),true);
$compatibility=$data['item']['compatibility'];//获取所有兼容性值
//爆炸值
$compatibility=数组过滤器(数组映射('trim',explode('.',$compatibility));
$new_xml=new simplexmlement(“”);//初始化新xml
//添加必要的值
$new_xml->addChild('item')->addChild('partno',$data['item']['partno']);
$new_xml->item->addChild('compatibility');
//循环值并将其作为子项添加
foreach($兼容为$值){
$value=trim(preg_replace(“/(\w+):/”,“$value));
$new_xml->item->compatibility->addChild('model',$value);
}
echo$new_xml->asXML();//输出为xml

对于simplexml,可以对元素的文本值运行正则表达式匹配

然后可以删除所有内部文本,并将解析结果作为新的子元素添加

这可以通过您所说的所有内容来完成:DOMDocument、simplexmlement——无论是否使用xpath

下面是SimpleXML()中的一个注释示例:

项目->兼容性;
#通过正则表达式解析模型的内部文本值
$pattern='~(model\\d?:[^.]+\\)?~u';
$result=preg_match_all($pattern,$compatibility,$matches);
#删除文本(称为simplexml自引用)
$compatibility->{0}='';
#将解析后的模型添加为新的模型元素
foreach($model与[1]匹配){
$compatibility->model[]=$model;
}
#输出xml
$xml->asXML($xml)php://output');
它给出的输出是:

<?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>

abc123
型号1:110C、115C、117C。型号2:1835C、1840C。型号3:210C、215C、3240C。

谢谢你的快速回答,效果非常好。是爆炸('.')让我感到震惊stumped@user3754085是的,在这个特殊情况下使用
explode()
很好,很高兴它能帮助我在“兼容性”中保留新的“model”元素parent@user3754085您现在可以检查编辑,我就这件事作了更正compatibility@user3754085好的,没问题。别忘了绿色的滴答声。感谢您花时间解释OP需要了解的复杂问题。我的回答有一个很大的缺点,我的回答引发了另一个问题,因为OP不知道引擎盖下发生了什么。另外,这个答案更好+1
<?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>