Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 名称空间未定义的DOMNode::getAttribute_Php_Xml_Domdocument_Xml Namespaces_Dom Node - Fatal编程技术网

Php 名称空间未定义的DOMNode::getAttribute

Php 名称空间未定义的DOMNode::getAttribute,php,xml,domdocument,xml-namespaces,dom-node,Php,Xml,Domdocument,Xml Namespaces,Dom Node,我正在处理的一个项目需要解析来自供应商的XML文档,但他们提供了无效的XML,该XML具有未声明名称空间的属性。当我同时尝试$node->getAttribute'prod:amount'和$node->getAttribute'amount'时,getAttribute$name会忽略它 我是做错了什么,还是有办法伪造定义 编辑提供XML摘录和PHP XML: 请注意,例如Firefox的某些XML视图不显示xmlns属性命名空间定义。如果没有收到错误消息,那么XML是有效的,请打开源代码检查

我正在处理的一个项目需要解析来自供应商的XML文档,但他们提供了无效的XML,该XML具有未声明名称空间的属性。当我同时尝试$node->getAttribute'prod:amount'和$node->getAttribute'amount'时,getAttribute$name会忽略它

我是做错了什么,还是有办法伪造定义

编辑提供XML摘录和PHP

XML:


请注意,例如Firefox的某些XML视图不显示xmlns属性命名空间定义。如果没有收到错误消息,那么XML是有效的,请打开源代码检查名称空间定义

在您发布的源中,缺少“amount”属性的前缀,因此它不会显示任何内容

$cost = $node->getAttribute("prod:amount");
但依赖文档中定义的名称空间前缀并不是一个好主意。更好的方法是使用名称空间本身

$xml = <<<'XML'
<order xmlns:prod="urn:products">
    <item id="85127" prod:id="1397" prod:amount="12.99"></item>
    <item id="85128" prod:id="93" prod:amount="24.99"></item>
</order>
XML;

const XMLNS_PROD = 'urn:products';

$doc = new DOMDocument;
$doc->loadXml($xml);
foreach($doc->getElementsByTagName("item") as $node) {
    $cost = $node->getAttributeNS(XMLNS_PROD, "amount");
    $id = $node->getAttributeNS(XMLNS_PROD, "id");
    var_dump($id, $cost);
}
因此,如果这里真的没有名称空间定义,那么可以通过添加一个名称空间来修复XML。这是一种变通方法,真正的解决方案是在XML的源代码处修复XML

$xml = str_replace('<order>', '<order xmlns:prod="urn:products">', $xml);
$doc = new DOMDocument;
$doc->loadXml($xml);

您可以发布一个XML示例和您正在使用的代码吗?您是否联系过供应商,告诉他们他们的XML无效?供应商不支持他们的API,这是一种方便的功能。99%的客户使用他们的GUI和内置集成点。但是,客户坚持认为需要将其添加到他们的销售门户中。您发布的代码无效-我可以从XML中提取金额,尽管DOMDocument确实发出了一个嘶嘶的声音,即关于未声明名称空间的大量警告。我可能会犯下最令人发指的罪行,并在XML中添加一个虚假的名称空间声明。我没有得到任何输出,下面是错误的屏幕截图:在$doc->load前面添加@以抑制警告后,它似乎起到了作用。
$xml = <<<'XML'
<order xmlns:prod="urn:products">
    <item id="85127" prod:id="1397" prod:amount="12.99"></item>
    <item id="85128" prod:id="93" prod:amount="24.99"></item>
</order>
XML;

const XMLNS_PROD = 'urn:products';

$doc = new DOMDocument;
$doc->loadXml($xml);
foreach($doc->getElementsByTagName("item") as $node) {
    $cost = $node->getAttributeNS(XMLNS_PROD, "amount");
    $id = $node->getAttributeNS(XMLNS_PROD, "id");
    var_dump($id, $cost);
}
string(4) "1397"
string(5) "12.99"
string(2) "93"
string(5) "24.99"
$xml = str_replace('<order>', '<order xmlns:prod="urn:products">', $xml);
$doc = new DOMDocument;
$doc->loadXml($xml);