Eu estou usando isso no SimpleXML e no PHP:
foreach ($xml->children() as $node) {
echo $node->attributes("namespace")->id;
}
Isso imprime o id
atributo de todos os nós (usando um namespace).
Mas agora eu quero saber o número da linha que $node
está localizado no arquivo XML.
Preciso do número da linha, porque estou analisando oArquivo XML e retornando às informações do usuário de possíveis problemas para resolvê-los. Então eu preciso dizer algo como: "Aqui você tem um erro na linha X". Tenho certeza de que o arquivo XML estaria em um formato padrão que terá quebras de linha suficientes para que isso seja útil.
Respostas:
8 para resposta № 1É possível com o DOM. DOMNode
fornece a função 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()
);
Saída:
int(2)
SimpleXML
SimpleXML é baseado em DOM, para que você possa converter SimpleXMLElement
objetos para DOMElement
objetos.
$element = new SimpleXMLElement($xml);
$node = dom_import_simplexml($element->bar);
var_dump($node->getLineNo());
E sim, na maioria das vezes, se você tiver um problema com o SimpleXML, a resposta é usar o DOM.
XMLReader
O XMLReader possui os números de linha internamente, mas não há um método direto para acessá-los. Mais uma vez você terá que convertê-lo em um DOMNode
. Funciona porque ambos usam libxml2
. Isto irá ler o nó e todos os seus descendentes na memória, por isso tenha cuidado com isso.
$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());
}
}