Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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中使用SimpleXML按属性添加新创建的xml元素的子元素会出现错误;属性已存在";错误_Php_Simplexml - Fatal编程技术网

在PHP中使用SimpleXML按属性添加新创建的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文档中创建两个“样式”子项,然后向它们添加子项。例如:

<?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=。。。工作。谢谢你的详细解释。