我有一个像这样的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树吗?
谢谢大家:)
答案 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,......)