2015-04-06 89 views
4

我SimpleXML中和PHP中使用這樣的:SimpleXML如何獲取節點的行號?

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

,打印所有節點的id屬性(使用命名空間)。

但是現在我想知道$node位於XML文件中的行號。

我需要行號,因爲我正在分析XML文件,並返回可能的問題的用戶信息來解決它們。所以我需要說一些類似於:「這裏你在X行有錯誤」。我敢肯定,XML文件將是一個標準格式,將有足夠的換行符,這是有用的。

+2

爲什麼你需要行號?一個XML文件只能有一行,換行不是強制性的。您可以使用'foreach($ xml-> children()作爲$ entry => $ node)獲得條目號{' –

+0

@MarkBaker我需要行號,因爲我正在分析xml文件並返回給用戶可能的問題的信息來解決它們。所以我需要說一些類似於:「這裏你在X行有錯誤」。我敢肯定,XML文件將是一個標準格式,將有足夠的線。感謝您的評論。 – Ismaestro

+0

你是「保證人」是錯位的......沒有要求XML文件有換行符,它不必以任何方式進行美化,而且實際上它通常不被批准 –

回答

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()); 
    } 
} 
+0

看起來'XMLReader :: expand :: getLineNo'的上限爲65535. – Drasill

+1

下面是一個選項LIBXML_PARSEHUGE,它可以在'open()'選項參數中使用。它改變了libxml的行爲。 – ThW

+0

感謝提示,但'LIBXML_PARSEHUGE'不能解決這個問題。 – Drasill