【问题标题】:Extracting tags from a XML file从 XML 文件中提取标签
【发布时间】:2014-05-13 08:29:57
【问题描述】:

我有一个这样的 XML 文件:

<root>
    <class id="CRWebService" url="http://webservice.click-rent.es/">
        <metodos>
            <metodo id="login">
                <descripcion>
                    <![CDATA[Envia la validación mediante la cabecera del documento SOAP para acceder a cualquier método de la clase.]]>
                </descripcion>     
            <parametros>
                <parametro>
                    <nombre>Login</nombre>
                    <tipo>Object</tipo>
                    <contenido>
                    <variable>
                        <nombre>user</nombre>
                        <tipo>String</tipo>
                        <descripcion>
                            <![CDATA[Nombre de usuario.]]>
                        </descripcion>
                    </variable>
                    <variable>
                        <nombre>password</nombre>
                        <tipo>String</tipo>
                        <descripcion>
                            <![CDATA[Contraseña.]]>
                        </descripcion>
                    </variable>
                </contenido>
                <descripcion>
                    <![CDATA[Nombre de usuario y contraseña suministrados por Click&Rent. Para validar estos parámetros es necesario enviarlos mediante una cabecera SOAPHeader.]]>
                </descripcion>
            </parametro>
        </parametros>

如您所见,我有一些“描述”字段,我想将它们提取并写入文件中。我正在用 PHP 做一个解析器,但我确信会有一个软件可以做到这一点,或者一个正则表达式可以帮助我节省几个小时的代码。那将是我的第一个问题:是否有任何工具或快速技巧来提取与关键字匹配的所有标签的内容(在这种情况下为“描述”)?

如果没有办法,我想做最通用的工具,但使用 SimpleXML,我已经看到我必须知道节点名称等。你知道如何在不知道 PHP 中节点名称的情况下读取完整的 XML 树吗?

谢谢大家:)

【问题讨论】:

    标签: php xml regex


    【解决方案1】:

    不要使用正则表达式;使用解析器。

    SimpleXML 有children(),它可以让你在不知道名字的情况下通过孩子。您可以递归地使用它来制作所有描述节点的列表。

    伪代码:

    function handleChildren($node, $search_key)
    {
      for($node->children() as $child) {
        if ($child->getName() == $search_key) {
           //Write to file
        }
        handleChildren($child, $search_key);
      }
    }
    

    【讨论】:

      【解决方案2】:

      使用 Xpath 从您的 XML 中获取数据:

      $dom = new DOMDocument();
      $dom->loadXml($xml);
      $xpath = new DOMXpath($dom);
      
      // iterate over any descripcion element in the document
      foreach ($xpath->evaluate('//descripcion') as $description) {
        $text = $description->nodeValue;
        // write to file
      }
      

      您可以将 Xpath 视为 xml 文档,就像您将 SQL 视为数据库一样。它是用于描述数据源部分的表达式的特定语言。

      它在大多数 DOM 实现中都有原生支持(PHP、所有主要浏览器中的 Javascript,...)

      【讨论】:

      • Xpath 到底是做什么的?你能解释一下你的答案吗?