【问题标题】:Why use an XML parser?为什么使用 XML 解析器?
【发布时间】:2010-08-30 01:01:28
【问题描述】:

我是一个有点经验丰富的 PHP 脚本编写者,但我只是深入解析 XML 和所有这些好东西。

我似乎无法理解为什么要使用单独的 XML 解析器而不是仅使用 explode 函数,这似乎同样简单。这是我一直在做的事情(假设路径xml.php 处有一个有效的XML 文件):

$contents = file_get_contents("xml.php");
$array1 = explode("<a_tag>", $contents);
$array2 = explode("</a_tag>", $array1[1]);
$data = $array2[0];

所以我的问题是,如果您可以将值分成数组并从中提取数据,那么 XML 解析器的实际用途是什么?

提前致谢! :)

【问题讨论】:

  • explode 是一个只属于游戏开发的方法名。

标签: php xml xml-parsing


【解决方案1】:

请原谅我不详述,但对于初学者来说,请尝试解析

$contents = '<a xmlns="urn:something"> 
  <a_tag>
    <b>..</b>
    <related>
      <a_tag>...</a_tag>
    </related>
  </a_tag>
  <foo:a_tag xmlns:foo="urn:something">
    <![CDATA[This is another <a_tag> element]]>
  </foo:a_tag>
</a>';

用你的爆炸方法。完成后,我们可以继续做一些更棘手的事情 ;-)

【讨论】:

    【解决方案2】:

    简而言之,它的一致性。在 XML 广泛使用之前,有许多未记录的格式用于将信息保存在文件中。 XML 背后的动机之一是创建定义良好的标准文档格式。有了这种明确定义的格式,就可以开发一套通用的解析工具,只要文档遵守上述明确定义的格式,就可以在文档上一致地工作。

    在某些特定情况下,您的示例代码会起作用。但是,如果文档发生变化

    ...
    <!-- adding an attribute -->
    <a_tag foo="bar">Contents of the Tag</a_tag>
    ...
    
    ...
    <!-- adding a comment to the contents -->
    <a_tag>Contents <!-- foobar --> of the Tag</a_tag>
    ...
    

    您的解析代码可能会中断。使用正确定义的 XML 解析器编写的代码不会。

    【讨论】:

      【解决方案3】:

      XML 解析器:

      • 处理编码
      • 可能有 xpath 支持
      • 让您轻松修改和保存XML;添加/删除子节点,添加/删除属性等。
      • 不需要将整个文件加载到内存中(DOM 解析器除外)
      • 了解命名空间
      • ...

      【讨论】:

        【解决方案4】:

        如果a_tag 有一个属性,你会如何分解同一个文件?

        毕竟explode("&lt;a_tag&gt;" ... 的工作方式与explode("&lt;a_tag attr='value'&gt;" ... 不同。

        XML 解析器了解 XML 规范。 Explode 只能处理最简单的情况,并且很可能在这种情况的很多情况下都会失败。

        【讨论】:

          【解决方案5】:

          使用经过验证的 XML 解析方法将使代码更易于维护和阅读。如果模式发生变化,它还将使其更容易适应,并且可以更容易地确定错误条件。 XPath 和 XSLT 的存在是有原因的,它们是经过验证的以合理、易读的方式处理 XML 数据的方法。我建议您使用适用于您给定情况的任何一种。请记住,仅仅因为您认为自己只是为一个特定目的编写代码,您永远不知道一段编写良好的代码会演变成什么。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-18
            • 1970-01-01
            • 1970-01-01
            • 2011-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多