/ / SimpleXML como obter o número da linha de um nó? - php, xml, dom, simplexml

SimpleXML como obter o número da linha de um nó? - php, xml, dom, simplexml

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