Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无分组的PHP XML_Php_Xml - Fatal编程技术网

无分组的PHP XML

无分组的PHP XML,php,xml,Php,Xml,我将使用PHP解析一个SVG文件,我已经用PHP SimpleXML做了一些测试,效果很好,但是它将所有具有相同类型的对象组合在一起,这对我的SVG不好 假设我有如下SVG文件: <svg> <g>SOME SVG</g> <path d="SOME X AND Y's"/> <g>SOME MORE SVG</g> </svg> 这一切都可以很好地编辑数据,但当我想再次将其转换回SVG时,我

我将使用PHP解析一个SVG文件,我已经用PHP SimpleXML做了一些测试,效果很好,但是它将所有具有相同类型的对象组合在一起,这对我的SVG不好

假设我有如下SVG文件:

<svg>
   <g>SOME SVG</g>
   <path d="SOME X AND Y's"/>
   <g>SOME MORE SVG</g>
</svg>
这一切都可以很好地编辑数据,但当我想再次将其转换回SVG时,我已经失去了对象的排序顺序!对于普通XML,这可能不是问题,但对于SVG文件,对象的顺序也是层排序顺序,因此如果我将输出转换回SVG,我将得到:

<svg>
   <g>SOME SVG</g>
   <g>SOME MORE SVG</g>
   <path d="SOME X AND Y's"/>
</svg>

一些SVG
再来点SVG
然后,“更多SVG”组可能会重叠并位于路径图形的顶部,即使路径应该位于“更多SVG”组的顶部。我该如何解决这个问题

我已经看到,我可以向所有对象添加例如order=“X”,但是由于文件从一开始就已经有了排序顺序,这似乎是不必要的。谢谢大家!

使用时,您不会遇到以下问题:

$svg = '<svg>
   <g>SOME SVG</g>
   <path d="SOME X AND Y\'s"/>
   <g>SOME MORE SVG</g>
</svg>';

$dom = new DOMDocument;
$dom->loadXml($svg);

$xpath = new DOMXpath($dom);

// selecting only g nodes directly under svg (root node)
$gNodes = $xpath->query('/svg/g'); // $gNodes will be of type: DOMNodeList with every element being of type: DOMElement, which extends DOMNode

foreach ($gNodes as $gNode) {
    // doing stuff with $gNode
    $gNode->nodeValue .= ' adding stuff';
}

echo $dom->saveXml();
$svg=”
一些SVG
再来点SVG
';
$dom=新的DOMDocument;
$dom->loadXml($svg);
$xpath=newdomxpath($dom);
//仅选择svg(根节点)正下方的g节点
$gNodes=$xpath->query('/svg/g');//$gNodes的类型为:DOMNodeList,每个元素的类型为:domeElement,它扩展了DOMNode
foreach($gNodes作为$gNode){
//用$gNode做事情
$gNode->nodeValue.=“添加内容”;
}
echo$dom->saveXml();
输出

<?xml version="1.0"?>
<svg>
   <g>SOME SVG adding stuff</g>
   <path d="SOME X AND Y's"/>
   <g>SOME MORE SVG adding stuff</g>
</svg>

一些SVG添加东西
更多的SVG添加内容
有用链接:


这看起来不错!我不熟悉DOM对象,但如何从每个对象内部获取SVG(在本例中为其自身变量)?比如:$arr[0]=“SOME SVG”$arr[1]=“”$arr[2]=更多的SVG;您可以在$arr数组中收集这些数据,但我不建议这样做,因为我倾向于直接处理dom结构。也许您可以给出一个更详细的示例,说明如何操作这些值,我将相应地更新示例代码。我希望获得xml第一级中的所有对象以及其中的数据。我需要能够将它们分别放到一个变量中,因为每个第一级包含将加载到不同页面上的数据。这对你有意义吗?@Carl Bengtsson我将代码改为包含
DOMXPath
,并添加了一些手册链接供进一步阅读。希望有帮助。谢谢你,非常有帮助!但是我仍然找不到如何从每个gNode获取完整的xml?我尝试使用echo$gNode->textContent,但没有返回任何结果。我需要->saveXml()之类的东西,但只需要$gNode。
<?xml version="1.0"?>
<svg>
   <g>SOME SVG adding stuff</g>
   <path d="SOME X AND Y's"/>
   <g>SOME MORE SVG adding stuff</g>
</svg>