我在SimpleXML和PHP中使用它:
foreach ($xml->children() as $node) {
echo $node->attributes('namespace')->id;
}
打印所有节点的id
属性(使用命名空间)。
但现在我想知道$node
在XML文件中的行号。
我需要行号,因为我正在分析XML文件,并返回可能问题的用户信息来解决它们。所以我需要说一句:“这里你在第X行有一个错误”。我确信XML文件将采用标准格式,有足够的换行符,以便有用。
答案 0 :(得分:8)
DOM可以实现。 DOMNode
提供函数getLineNo()
。
$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基于DOM,因此您可以将SimpleXMLElement
个对象转换为DOMElement
个对象。
$element = new SimpleXMLElement($xml);
$node = dom_import_simplexml($element->bar);
var_dump($node->getLineNo());
是的,大部分时间如果您遇到SimpleXML问题,答案是使用DOM。
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());
}
}