从XML文件中提取标记

时间:2014-05-13 08:29:58

标签: php xml regex

我有一个像这样的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>

正如你所看到的,我有一些&#34;描述&#34;我要提取的字段并将它们写入文件中。我正在使用PHP编写解析器,但我确信会有一个可以执行此操作的软件,或者可以帮助我节省几个小时的代码的正则表达式。这将是我的第一个问题:是否有任何工具或快速技巧来提取与关键字匹配的所有标签的内容(&#34;描述&#34;在这种情况下)?

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

谢谢大家:)

2 个答案:

答案 0 :(得分:0)

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

SimpleXML具有children(),可让您在不知道名称的情况下浏览孩子。您可以递归使用它来创建所有描述节点的列表。

伪代码:

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

答案 1 :(得分:0)

使用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,......)