Как получить родительский узел с помощью xpath, используя simpleXML (php)

У меня проблемы с файлом XML.

Вот :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheetPr codeName="Feuil3">
<tabColor rgb="FF00B050"/>
</sheetPr>
<dimension ref="A18"/>
<sheetViews>
<sheetView tabSelected="1" topLeftCell="A3" workbookViewId="0">
<selection activeCell="A3" sqref="A3"/>
</sheetView>
</sheetViews>
<sheetFormatPr baseColWidth="10" defaultRowHeight="15"/>
<cols>
<col min="1" max="1" width="29.140625" bestFit="1" customWidth="1"/>
<col min="2" max="2" width="24.42578125" bestFit="1" customWidth="1"/>
<col min="3" max="3" width="14.28515625" bestFit="1" customWidth="1"/>
<col min="4" max="4" width="5.42578125" bestFit="1" customWidth="1"/>
<col min="5" max="5" width="6.140625" bestFit="1" customWidth="1"/>
</cols>

<sheetData>
<row r="18" ht="16.5" customHeight="1"/>
</sheetData>
<sortState ref="A2:E1036">
<sortCondition descending="1" ref="C1"/>
</sortState>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>

Я хотел бы иметь родительский узел (строку) с этими ограничениями xpath (это работает):

$row2 = $xml->xpath("//*[local-name()='row']/@*[local-name()='r' and .= '18']");

На данный момент он возвращает мне это:

array(1) {
[0]=>
object(SimpleXMLElement)#383 (1) {
["@attributes"]=>
array(1) {
["r"]=>
string(2) "18"}
}
}

Я хотел бы иметь родителя .. (строка)

Как я должен сделать?

Большое спасибо.

0

Решение

На первом месте. Чтобы избавиться от local-name() и прекратите игнорировать пространство имен, зарегистрируйте для него префикс. После этого это просто простое условие.

$worksheet = new SimpleXMLElement($xml);
$worksheet->registerXpathNamespace(
'm', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'
);

var_dump(
$worksheet->xpath('//m:row[@r=18]')
);

Выход:

array(1) {
[0]=>
object(SimpleXMLElement)#2 (1) {
["@attributes"]=>
array(3) {
["r"]=>
string(2) "18"["ht"]=>
string(4) "16.5"["customHeight"]=>
string(1) "1"}
}
}

SimpleXMLElement::xpath() всегда будет возвращать массив. Здесь может быть несколько или нет row элемент. Используйте условие для проверки того, что вы выбрали узел, или используйте цикл для итерации по массиву.

Выражение в этом случае состоит из двух частей: //m:row принести любой row элемент узла в документе. [] содержит условия фильтрации для найденных узлов. В этом случае @id=18, атрибут узла id должен равняться 18,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]