在PHP中使用SimpleXML按属性添加新创建的xml元素的子元素会出现错误;属性已存在";错误
我想在此xml文档中创建两个“样式”子项,然后向它们添加子项。例如:在PHP中使用SimpleXML按属性添加新创建的xml元素的子元素会出现错误;属性已存在";错误,php,simplexml,Php,Simplexml,我想在此xml文档中创建两个“样式”子项,然后向它们添加子项。例如: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Style id="red"> <LineStyle> <color>ff0000ff</color>
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Style id="red">
<LineStyle>
<color>ff0000ff</color>
<width>1</width>
</LineStyle>
<PolyStyle>
<color>110000ff</color>
</PolyStyle>
</Style>
<Style id="blue">
<LineStyle>
<color>ffff0000</color>
<width>1</width>
</LineStyle>
<PolyStyle>
<color>11ff0000</color>
</PolyStyle>
</Style>
</Document>
</kml>
但是$style为空并返回
在null上调用成员函数addChild()
问题是尽管你打电话
$xml->Document->addChild("Style");
两次添加新样式元素时,始终使用
$xml->Document->Style->addAttribute("id", "red");
执行此操作时,此方法将始终等同于在第一个样式元素上设置id属性(当找到Style
中的多个元素时,它将始终假定第一个元素)。因此,第二次执行此操作时(使用“id”,“blue”
),它将从第一次调用开始就存在(设置为“red”
)
更好的方法是存储addChild()
中的返回值,然后在此元素中设置详细信息
$style2 = $xml->Document->addChild("Style");
$style2->addAttribute("id", "blue");
$style2->addChild("PolyStyle");
等等
XPath表达式的问题在于,您试图通过一个属性来标识它,而这个属性在找到节点之前是无法添加的,所以有点尴尬。你可以
$xml->Document->Style[1]->addAttribute("id", "red");
但这意味着要跟踪您创建的
样式
元素的数量,并更新[1]
——这是有风险的。问题是,尽管您调用
$xml->Document->addChild("Style");
两次添加新样式元素时,始终使用
$xml->Document->Style->addAttribute("id", "red");
执行此操作时,此方法将始终等同于在第一个样式元素上设置id属性(当找到Style
中的多个元素时,它将始终假定第一个元素)。因此,第二次执行此操作时(使用“id”,“blue”
),它将从第一次调用开始就存在(设置为“red”
)
更好的方法是存储addChild()
中的返回值,然后在此元素中设置详细信息
$style2 = $xml->Document->addChild("Style");
$style2->addAttribute("id", "blue");
$style2->addChild("PolyStyle");
等等
XPath表达式的问题在于,您试图通过一个属性来标识它,而这个属性在找到节点之前是无法添加的,所以有点尴尬。你可以
$xml->Document->Style[1]->addAttribute("id", "red");
但这意味着要跟踪您创建的
样式
元素的数量,并更新[1]
——这些元素存在风险。看看它们在哪里展示了应该如何做的示例。方法addChild()
返回元素,以便将其存储在变量中,并将所有属性等添加到该特定元素实例中。类似于:$el=$xml->foo->addChild('bar')$el->addAttribute(…)代码>等。当有疑问时,总是从检查您正在使用的函数/方法开始。看看他们在哪里展示了应该如何执行的示例。方法addChild()
返回元素,以便将其存储在变量中,并将所有属性等添加到该特定元素实例中。类似于:$el=$xml->foo->addChild('bar')$el->addAttribute(…)代码>等。当有疑问时,总是从检查您正在使用的函数/方法开始。使用$style2=。。。工作。感谢您的详细解释。使用$style2=。。。工作。谢谢你的详细解释。