【问题标题】:How to parse xml with php? [duplicate]如何用php解析xml? [复制]
【发布时间】:2012-12-16 05:13:12
【问题描述】:

可能重复:
Best XML Parser for PHP
How to parse XML file using php

我无法解析这个 xml...真正的 xml 是 here

    <?xml version="1.0" encoding="ISO-8859-1" ?>
<eqlist>
    <earhquake  name="2012.12.31 18:35:13"  lokasyon="CAMONU-AKHISAR (MANİSA)                           İlksel" lat="38.9572"   lng="27.8965"   mag="2.9" Depth="5.0" />
    <earhquake  name="2012.12.31 18:54:09"  lokasyon="VAN GÖLÜ                                          İlksel" lat="38.7273"   lng="43.1598"   mag="2.3" Depth="2.1" />
    <earhquake  name="2012.12.31 21:00:49"  lokasyon="KUCUKESENCE-ERENLER (SAKARYA)                     İlksel" lat="40.7347"   lng="30.4742"   mag="1.9" Depth="4.4" />
</eqlist>

我该如何解析它?问题来自运行不错的远程站点的谷歌地图应用程序的 xml 文件的前两个字符。看看那个数组

[0] => ÿþ<?xml version="1.0" encoding="ISO-8859-1" ?>

【问题讨论】:

  • 你试过什么? PHP 有几个 XML 解析扩展 - SimpleXML、DOM、SAX...
  • 你不敢用谷歌搜索php xml吗?
  • 我认为答案可能不像你在谷歌上找到的 PHP XML 那样简单。去看看原始文件。这个问题的作者恰好选择了正确解析的行。整个文档没有!
  • 不仅仅是 XML 标签 - 整个文档都有不可见的字符。您可以通过在任何行上使用 strlen() 来检测这一点。如果你计算你看到的,它会比从 strlen() 传递的值少很多。建议您联系发布者并询问有关字符编码的信息。另外,请阅读:joelonsoftware.com/articles/Unicode.html

标签: php xml xml-parsing


【解决方案1】:

您可以使用 SimpleXML_Load_String。

<?php // RAY_temp_burhan.php
error_reporting(E_ALL);
echo '<pre>';

$xml = <<<ENDXML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<eqlist>
    <earhquake  name="2012.12.31 18:35:13"  lokasyon="CAMONU-AKHISAR (MANISA)                           Ilksel" lat="38.9572"   lng="27.8965"   mag="2.9" Depth="5.0" />
    <earhquake  name="2012.12.31 18:54:09"  lokasyon="VAN GÖLÜ                                          Ilksel" lat="38.7273"   lng="43.1598"   mag="2.3" Depth="2.1" />
    <earhquake  name="2012.12.31 21:00:49"  lokasyon="KUCUKESENCE-ERENLER (SAKARYA)                     Ilksel" lat="40.7347"   lng="30.4742"   mag="1.9" Depth="4.4" />
</eqlist>
ENDXML;

// CONVERT TO AN OBJECT
$obj = SimpleXML_Load_String($xml);

// PARSE OUT SOME ATTRIBUTES
foreach ($obj as $quake)
{
    // ATTRIBUTE NAMES ARE CASE-SENSITIVE
    $loc = $quake->attributes()->lokasyon;
    $dep = $quake->attributes()->Depth;
    echo PHP_EOL . "$loc $dep";
}

【讨论】:

  • 现在,在查看了原始文档后,我发现 XML 中可能存在一些无效字符。所以可能是字符集编码问题。当我尝试直接使用原件时,它失败了,但是当我将它复制到我的文本编辑器中时,一些字符被转换(并且它有效)。您可能想尝试不同的字符编码,例如 utf-8
  • 我认为你需要回到这个文档的起源。前两个字符中似乎有一些东西(可能是字节顺序标记)。 Chrome 认为它是土耳其语并想翻译它;-)
  • 感谢 Ray,原始文档中包含 xml 炸弹。我正在尝试删除它。
  • 我将文档复制到 TextPad 并保存。这对某些角色产生了影响。文件来自哪里?
  • 它的土耳其语。真正的问题是如何从远程站点解析原始 xml 文件。
【解决方案2】:

面向对象的方式

$xml = <<<ENDXML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<eqlist>
    <earhquake  name="2012.12.31 18:35:13" 
                lokasyon="CAMONU-AKHISAR (MANISA) Ilksel"
                lat="38.9572"
                lng="27.8965"   mag="2.9" Depth="5.0" />
    <!-- Etc... -->
</eqlist>
ENDXML;

$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOBLANKS);

然后就可以使用DOMDocument定义的各种方法了。其中一种用于检查 XSD 有效性的方法是 schemaValidate

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2015-07-02
  • 1970-01-01
  • 2011-06-26
  • 2018-11-18
相关资源
最近更新 更多