У меня есть эта строка XMP $ XML:Получить значение тега XML/XMP в PHP
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<xmp:CreatorTool>Microsoft Photo Gallery 16.4.3528.331</xmp:CreatorTool>
<xmp:Rating>2</xmp:Rating>
</rdf:Description>
<rdf:Description rdf:about="uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b" xmlns:MP="http://ns.microsoft.com/photo/1.2/">
<MP:RegionInfo>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPRI:Regions xmlns:MPRI="http://ns.microsoft.com/photo/1.2/t/RegionInfo#">
<rdf:Bag xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:li>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.144259, 0.358824, 0.065751, 0.098529</MPReg:Rectangle>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.211973, 0.294118, 0.023553, 0.035294</MPReg:Rectangle>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.350343, 0.423529, 0.056919, 0.085294</MPReg:Rectangle>
<MPReg:PersonDisplayName xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">xc</MPReg:PersonDisplayName>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.352306, 0.300000, 0.023553, 0.035294</MPReg:Rectangle>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.395486, 0.304412, 0.047105, 0.070588</MPReg:Rectangle>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.823356, 0.560294, 0.095191, 0.142647</MPReg:Rectangle>
</rdf:Description>
</rdf:li>
</rdf:Bag>
</MPRI:Regions>
</rdf:Description>
</MP:RegionInfo>
</rdf:Description>
<rdf:Description xmlns:MicrosoftPhoto="http://ns.microsoft.com/photo/1.0/">
<MicrosoftPhoto:Rating>25</MicrosoftPhoto:Rating>
</rdf:Description>
<rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>
<rdf:Alt xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:li xml:lang="x-default">edgf</rdf:li>
</rdf:Alt>
</dc:title>
</rdf:Description>
<rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:description>
<rdf:Alt xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:li xml:lang="x-default">edgf</rdf:li>
</rdf:Alt>
</dc:description>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
Я заинтересуют 2 теги: MPReg: Прямоугольник и MPReg: PersonDisplayName. Я хочу прочитать значение Rectangle только в том случае, если есть имя PersonDisplay в том же теге.
Я попытался преобразования XMP в массив, используя этот код:
function get_xmp_array(&$xmp_raw) {
$xmp_arr = array();
foreach (array(
'RectangleCoords' => '<MPReg:Rectangle[^>]+?xmlns:MPReg="([^"]*)"',
'attempt2' => '<MPReg:Rectangle>\s*(.*?)\s*<\/MPReg:Rectangle>'
) as $key => $regex) {
// get a single text string
$xmp_arr[$key] = preg_match("/$regex/is", $xmp_raw, $match) ? $match[1] : '';
// if string contains a list, then re-assign the variable as an array with the list elements
$xmp_arr[$key] = preg_match_all("/<rdf:li[^>]*>([^>]*)<\/rdf:li>/is", $xmp_arr[$key], $match) ? $match[1] : $xmp_arr[$key];
// hierarchical keywords need to be split into a third dimension
if (! empty($xmp_arr[$key]) && $key == 'Hierarchical Keywords') {
foreach ($xmp_arr[$key] as $li => $val) $xmp_arr[$key][$li] = explode('|', $val);
unset ($li, $val);
}
}
return $xmp_arr;
}
Но это не сработало, он вернулся этот:
'RectangleCoords' => string 'http://ns.microsoft.com/photo/1.2/t/Region#'
'attempt2' => string ''
Я попробовал несколько функций, таких как:
function getTextBetweenTags($string, $tagname) {
$pattern = "/<$tagname ?.*>(.*)<\/$tagname>/";
preg_match($pattern, $string, $matches);
return $matches[1];
}
Эта функция вернула только первое совпадение, я не знаю, как получить все совпадения.
Я также попытался это:
$doc = new DOMDocument();
$doc->loadXML($xml);
$result = $doc->getElementsByTagName('MPReg:Rectangle');
var_dump($result);
Но он не вернулся ничего:
object(DOMNodeList)[3]
Я очень ценю вашу помощь на этом.
Спасибо
[ 'DOMDocument :: getElementsByTagNameNS'] (HTTP: // PHP.net/manual/en/domdocument.getelementsbytagnamens.php) будет _proper_ способом получить эти _namespaced_ элементы. – CBroe