【问题标题】:Loading XML, possible malformed name space or am doing it wrong?加载 XML,可能是格式错误的名称空间还是做错了?
【发布时间】:2016-01-18 09:40:17
【问题描述】:

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

这是我第一次弄乱命名空间,我什至无法加载文件。当我尝试时

$xml = new SimpleXMLElement($result) or die("Error: Cannot create object\n<hr>".$result);

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

我已经使用 4 个不同的在线验证器验证了 xml 提要。 3 似乎使用 javascript 并说提要是完美的,第 4 位 http://www.xmlvalidation.com/ 将代码上传到其站点并返回说他们的站点有错误。(使用其他 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 页面 http://waterservices.usgs.gov/nwis/iv/?format=waterml,1.1&sites=06306300&parameterCd=00060,00065

【问题讨论】:

  • 您到底想做什么?只创建 SimpleXmlObject?
  • 我想处理 xml 提要,检索各种有用的数据,然后用它在我的网站上创建一个页面。使用来自其他来源的提要,我创建了一个 SimpleXmlObject,然后使用 xpath() 来查找我要查找的内容。如果我有另一种更好的游戏方式。
  • 看我的回答。希望它能解决您的问题

标签: php xml simplexml


【解决方案1】:

使用不同的命名空间尝试以下解决方案。

$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_spaces 将在xml 文档中列出所有命名空间。 print_r($name_spaces); 的输出将是

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 对象并对其进行迭代以获得所需的输出。

【讨论】:

  • foreach ($withns1-&gt;xpath('//ns1:timeSeries') as $Station) 那是用您的代码调用 xpath 的正确方法吗?
  • 是的,它会起作用,但也取决于您需要什么类型的结果。更好地使用foreach ($withns1-&gt;timeSeries-&gt;children($name_spaces['ns1']) as $Station){
  • 我最终得到了foreach ($withns1-&gt;timeSeries as $Station) 然后将其视为普通 XML 似乎是最简单的方法(花了很长时间才发现,一旦完成上述操作,它就像普通 XML 一样,除了如果没有一些额外的工作,Xpath 将无法工作。现在它开始变得有意义了。
  • 请注意,除了调试之外,您不需要进行getNamespaces 调用;如果您乐于依赖前缀ns1 等不会改变(他们可以在不改变文件含义的情况下!),您可以只做-&gt;children('ns1', true) 等等。更好的是硬编码实际的命名空间标识符(不能更改):define('XMLNS_WATERML', 'http://www.cuahsi.org/waterML/1.1/'); $with_waterml = $xml_element-&gt;children(XMLNS_WATERML);
【解决方案2】:

这应该可行:

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

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 我认为问题在于为什么无法将 XML 数据加载到 simpleXML 元素中并提供命名空间作为参数 4 来解决问题。
  • 这确实回答了这个问题,事实上它可能最接近回答实际问题,因为它使用相同类型的代码。我不确定为什么它应该工作,因为有几个命名空间,但它确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2013-09-06
  • 1970-01-01
  • 2019-07-04
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多