SimpleXML如何获取节点的行号?

时间:2015-04-06 18:08:41

标签: php xml dom simplexml

我在SimpleXML和PHP中使用它:

foreach ($xml->children() as $node) {
    echo $node->attributes('namespace')->id;
}

打印所有节点的id属性(使用命名空间)。

但现在我想知道$node在XML文件中的行号。

我需要行号,因为我正在分析XML文件,并返回可能问题的用户信息来解决它们。所以我需要说一句:“这里你在第X行有一个错误”。我确信XML文件将采用标准格式,有足够的换行符,以便有用。

1 个答案:

答案 0 :(得分:8)

DOM可以实现。 DOMNode提供函数getLineNo()

DOM

$xml = <<<'XML'
<foo>
  <bar/>
</foo>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

var_dump(
  $xpath->evaluate('//bar[1]')->item(0)->getLineNo()
);

输出:

int(2)

的SimpleXML

SimpleXML基于DOM,因此您可以将SimpleXMLElement个对象转换为DOMElement个对象。

$element = new SimpleXMLElement($xml);
$node = dom_import_simplexml($element->bar);
var_dump($node->getLineNo());

是的,大部分时间如果您遇到SimpleXML问题,答案是使用DOM。

的XMLReader

XMLReader内部有行号,但这里没有直接访问它们的方法。您必须再次将其转换为DOMNode。它的工作原理是因为它们都使用libxml2。这会将节点及其所有后代读入内存,因此请小心。

$reader = new XMLReader();
$reader->open('data://text/xml;base64,'.base64_encode($xml));

while ($reader->read()) {
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->name== 'bar') {
    var_dump($reader->expand()->getLineNo());
  }
}