如何使用PHP的DOM Parser从XML中提取节点属性

Bel*_*ish 8 php xml dom

我以前从未真正使用过DOM解析器,现在我有一个问题.

我该如何从这个标记中提取URL:

<files>
    <file path="http://www.thesite.com/download/eysjkss.zip" title="File Name" />
</files>
Run Code Online (Sandbox Code Playgroud)

Ale*_*min 13

使用simpleXML:

$xml = new SimpleXMLElement($xmlstr);
echo $xml->file['path']."\n";
Run Code Online (Sandbox Code Playgroud)

输出:

http://www.thesite.com/download/eysjkss.zip
Run Code Online (Sandbox Code Playgroud)

  • 小心点 $ xml-> file ['path']的值不是字符串.它是SimpleXMLElement的一个实例. (4认同)
  • 确实.将值与另一个字符串进行比较时可能会出现问题,但您可以事先将此值转换为字符串`(string)$ xml-> file ['path']` (2认同)

Gor*_*don 11

要用DOM做到这一点

$dom = new DOMDocument;
$dom->load( 'file.xml' );
foreach( $dom->getElementsByTagName( 'file' ) as $file ) {
    echo $file->getAttribute( 'path' );
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用XPath执行此操作:

$dom = new DOMDocument;
$dom->load( 'file.xml' );
$xPath = new DOMXPath( $dom );
foreach( $xPath->evaluate( '/files/file/@path' ) as $path ) {
    echo $path->nodeValue;
}
Run Code Online (Sandbox Code Playgroud)

或者直接作为字符串值:

$dom = new DOMDocument;
$dom->load( 'file.xml' );
$xPath = new DOMXPath( $dom );
echo $xPath->evaluate( 'string(/files/file/@path)' );
Run Code Online (Sandbox Code Playgroud)

您也可以通过手动遍历DOM来获取单个节点

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->load( 'file.xml' );
echo $dom->documentElement->firstChild->getAttribute( 'path' );
Run Code Online (Sandbox Code Playgroud)

标记这个CW,因为这已经多次回答(只是使用不同的元素),包括我,但我懒得找到重复.