Php 正在加载XML,可能是名称空间格式错误,还是我做错了?

Php 正在加载XML,可能是名称空间格式错误,还是我做错了?,php,xml,simplexml,Php,Xml,Simplexml,我在加载带有php脚本的XML提要时遇到问题。我在我的网站上复制了一份feed并加载它,这样我就知道我在调试什么了。文件中的每个条目都有一个名称空间(有几个不同的名称空间) 这是我第一次使用名称空间,我甚至无法加载文件。当我尝试 $xml=newsimplexmlement($result)或die(“错误:无法创建对象\n”$result) 它触发错误。这对十几个没有名称空间的提要都有效(或者至少我没有注意到任何名称空间)。我尝试了各种方法来获取更多关于为什么它不能创建simpleXMLEle

我在加载带有php脚本的XML提要时遇到问题。我在我的网站上复制了一份feed并加载它,这样我就知道我在调试什么了。文件中的每个条目都有一个名称空间(有几个不同的名称空间)

这是我第一次使用名称空间,我甚至无法加载文件。当我尝试

$xml=newsimplexmlement($result)或die(“错误:无法创建对象\n
”$result)

它触发错误。这对十几个没有名称空间的提要都有效(或者至少我没有注意到任何名称空间)。我尝试了各种方法来获取更多关于为什么它不能创建simpleXMLElement的信息,到目前为止,它们都没有返回问题

我已经用4个不同的在线验证程序验证了xml提要。3似乎使用javascript,并表示提要是完美的,第4个将代码上传到其站点,并返回说他们的站点有错误。(对于其他xml,他们的验证器工作正常。)

我想我已经把问题缩小到了名字空间的问题。如果我删除顶部的名称空间内容,我可以用上面的代码加载xml文件,然后我会得到一堆名称空间错误。下面您可以看到名称空间信息

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:timeSeriesResponse xsi:schemaLocation="http://www.cuahsi.org/waterML/1.1/ http://waterservices.usgs.gov/WaterML-1.1.xsd" xmlns:ns1="http://www.cuahsi.org/waterML/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:queryInfo xmlns:ns2="http://www.cuahsi.org/waterML/1.1/">


链接到示例xml页面

这应该可以使用:

$xml = new SimpleXMLElement($your_xml_data, 0, false, 'ns1', true);

通过使用不同的名称空间尝试以下解决方案

$xml_element = simplexml_load_file('http://waterservices.usgs.gov/nwis/iv/?format=waterml,1.1&sites=06306300&parameterCd=00060,00065');
$name_spaces = $xml_element->getNamespaces(true);
print_r($name_spaces);
$withns1 = $xml_element->children($name_spaces['ns1']);
$withns2 = $xml_element->children($name_spaces['ns2']);
$withxsi = $xml_element->children($name_spaces['xsi']);

var_dump($withns1);
var_dump($withns2);
var_dump($withxsi);
变量
$name\u spaces
将在xml文档中列出所有名称空间。
print\r($name\u空格)的输出将被删除

Array
(
    [ns1] => http://www.cuahsi.org/waterML/1.1/
    [xsi] => http://www.w3.org/2001/XMLSchema-instance
    [ns2] => http://www.cuahsi.org/waterML/1.1/
)

使用上述方法,您可以获取xml对象并对其进行迭代以获得所需的输出。

您到底想做什么?仅创建SimpleXmlObject?我想处理xml提要,检索各种有用的数据,然后使用它在我的网站上创建页面。使用来自其他源的提要,我创建了一个SimpleXmlObject,然后使用xpath()查找我要查找的内容。如果还有其他更好的方法,请看我的答案。希望它能解决您的问题,
foreach('withns1->xpath('//ns1:timeSeries')作为$Station)
这是用代码调用xpath的正确方法吗?是的,它可以工作,但也取决于您需要的结果类型。更好地使用
foreach($withns1->timeSeries->children($name_spaces['ns1'])作为$Station){
了解更多详细的解决方案,我最终得到了
foreach($withns1->timeSeries作为$Station)
然后将其作为普通XML处理似乎是最简单的方法(花了很长时间才发现,一旦完成上述操作,它就和普通XML一样,只是Xpath如果没有额外的工作就无法工作。现在它开始单击并变得有意义了。请注意,除了调试,您不需要执行
getNamespaces
调用;如果您愿意依赖前缀
ns1
等,则无需执行
getNamespaces
调用。)不更改(它们可以不更改文件的含义!)您只需执行
->children('ns1',true)
等操作。最好是硬编码实际的命名空间标识符(不能更改):
定义('XMLNS\u WATERML','http://www.cuahsi.org/waterML/1.1/');$with_waterml=$xml_元素->子元素(XMLNS_waterml)
这并没有提供问题的答案。若要评论或要求作者澄清,请在他们的帖子下方留下评论。-我认为问题在于为什么无法将XML数据加载到simpleXML元素中,并提供名称空间作为参数4来解决问题。这确实回答了问题,事实上它是支持的bably最接近于回答实际问题,因为它使用相同类型的代码。我不确定为什么它应该工作,因为有几个名称空间,但它确实工作。