php domdocument获取节点值,其中属性值为

php domdocument获取节点值,其中属性值为,php,attributes,domdocument,nodevalue,Php,Attributes,Domdocument,Nodevalue,假设我的XML如下所示: <record> <row name="title">this item</row> <row name="url">this url</row> </record> $xml = new DOMDocument(); $xml->load('xmlfile.xml'); echo $xml->getElementByTagName('row')->item(0)-&g

假设我的XML如下所示:

<record>
  <row name="title">this item</row>
  <row name="url">this url</row>
</record>
$xml = new DOMDocument();
$xml->load('xmlfile.xml');

echo $xml->getElementByTagName('row')->item(0)->attributes->getNamedItem('title')->nodeValue;
但这只是给了我:

注意:正在尝试获取非对象id的属性

有人知道如何获取“name”属性值为“title”的节点值吗?

试试:

$xml=newDOMDocument();
$xml->loadXml('
此项
此url
');
$xpath=newdomxpath($xml);
//遍历所有结果
foreach($xpath->query('//row[@name=“title”]')作为$rowNode){
echo$rowNode->nodeValue;//将是“此项”
}
//或者直接访问第一个结果
$rowNode=$xpath->query('//row[@name=“title”][1]')->项(0);
if($rowNode instanceof domeElement){
echo$rowNode->nodeValue;
}

使用XPath:
/record/row[@name='title']
。就像Michael在回答中回答的那样。这看起来是正确的选择。但是我无法让它工作。有关DOM和SimpleXML的完整示例,请参阅。只需将其调整为XML即可。关于StackOverflow还有很多其他例子显示了DOM的使用情况。谢谢Gordon,但正如我在其他回答中所说的,由于内存的使用,我不想使用foreach循环。如果内存是一个问题,你不应该首先使用DOM。它将使用大约十倍于源文档的大小,因为它必须将xml扩展到树中。那就试试XML阅读器吧。foreach绝对不是一个问题,这给我留下了相同的php注意。注意:在代码中尝试获取非对象inI的属性,对我有效。如果XPath不匹配,您将收到通知-然后项(0)不是domeElement,您无法读取nodeValue,因此会出现消息。您是在XML中使用名称空间,还是它的内容与您发布的内容完全相同?正如Gordon在我的帖子中评论的那样,XMLReader解决了这个问题。谢谢你的帮助。我不想用foreach。为这一项遍历整个XML需要非常多的内存。@Frits的
foreach
只是如何使用
$xpath->query
结果的一个示例(这将是一个示例)。此外,我还添加了一些代码,以展示如何直接访问第一个结果。正如Gordon在我的帖子中评论的那样,这个问题是通过XMLReader解决的。谢谢您的帮助。@saravanabawa不用于加载html,请改用。我不想使用foreach。为这一项浏览整个XML需要大量内存。我正在使用的html可能不是有效的XML,因此我理解此解决方案不依赖于将html视为XML。
foreach ($xml->getElementsByTagName('row') as $element)
{
if ($element->getAttribute('name') == "title")
{
 echo $element->nodeValue;
}
}
$xml = new DOMDocument();
$xml->loadXml('
<record>
  <row name="title">this item</row>
  <row name="url">this url</row>
</record>
');

$xpath = new DomXpath($xml);

// traverse all results
foreach ($xpath->query('//row[@name="title"]') as $rowNode) {
    echo $rowNode->nodeValue; // will be 'this item'
}

// Or access the first result directly
$rowNode = $xpath->query('//row[@name="title"][1]')->item(0);
if ($rowNode instanceof DomElement) {
    echo $rowNode->nodeValue;
}
$xpath = new DOMXPath( $xml );
$val = $xpath->query( '//row[@name="title"]' )->item(0)->nodeValue;