DOMXPath 不适用于有效的表达式
DOMXPath not working with valid expression
我有以下 SVG:
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-194.2 -103.1 178.2 480.9" enable-background="new -194.2 -103.1 178.2 480.9" xml:space="preserve">
<filter height="140%" width="140%" id="Filter_1" y="-20%" x="-20%" color-interpolation-filters="sRGB">
<feColorMatrix type="matrix" result="result1" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0" in="SourceGraphic">
</feColorMatrix>
</filter>
<g id="color1">
<g transform="matrix( 1, 0, 0, 1, -0.3,27) ">
<g id="Layer_1_1_">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<g>
<path fill="#999999" d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="color2">
<g transform="matrix( 1, 0, 0, 1, -0.4,18.65) ">
<g id="Layer_1_2_">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<g>
<path fill="#666666" d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="lineart_1_">
<g transform="matrix( 1, 0, 0, 1, -0.3,27) ">
<g id="Layer_2">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<path fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" d="..."/>
</g>
</g>
</g>
<g id="lineart">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<g>
<path d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="itemMask">
<g transform="matrix( 1, 0, 0, 1, -0.3,27) ">
<g id="Layer_1_3_">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g filter="url(#Filter_1)">
<g>
<path fill="#999999" d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="actions">
</g>
</svg>
我编写了以下 PHP 代码来提取 ID 不匹配或部分匹配的第一级元素 lineart.
<?php
$thisEntryDoc = new DOMDocument();
$thisEntryDoc->load('test.svg');
$xpath = new DOMXpath($thisEntryDoc);
$xpath->registerNamespace('svg', "http://www.w3.org/1999/xlink");
$elements = $xpath->query("//svg:svg/svg:g[not(contains(@id, 'lineart'))]");
foreach($elements as $element) {
echo "Found {$element->nodeName}\n";
}
?>
这不会产生任何结果。我已经使用在线工具测试了 XPath,它运行良好。唯一能产生任何结果的表达式是 //*
。
我完全莫名其妙。有谁知道为什么经过验证的 XPath 表达式根本不起作用?
我认为您的命名空间注册有误。
这是 xlink
命名空间,不是默认命名空间:
$xpath->registerNamespace('svg', "http://www.w3.org/1999/xlink");
大概应该是:
$xpath->registerNamespace( 'svg', "http://www.w3.org/2000/svg" );
我有以下 SVG:
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-194.2 -103.1 178.2 480.9" enable-background="new -194.2 -103.1 178.2 480.9" xml:space="preserve">
<filter height="140%" width="140%" id="Filter_1" y="-20%" x="-20%" color-interpolation-filters="sRGB">
<feColorMatrix type="matrix" result="result1" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0" in="SourceGraphic">
</feColorMatrix>
</filter>
<g id="color1">
<g transform="matrix( 1, 0, 0, 1, -0.3,27) ">
<g id="Layer_1_1_">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<g>
<path fill="#999999" d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="color2">
<g transform="matrix( 1, 0, 0, 1, -0.4,18.65) ">
<g id="Layer_1_2_">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<g>
<path fill="#666666" d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="lineart_1_">
<g transform="matrix( 1, 0, 0, 1, -0.3,27) ">
<g id="Layer_2">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<path fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" d="..."/>
</g>
</g>
</g>
<g id="lineart">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g>
<g>
<path d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="itemMask">
<g transform="matrix( 1, 0, 0, 1, -0.3,27) ">
<g id="Layer_1_3_">
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<g filter="url(#Filter_1)">
<g>
<path fill="#999999" d="..."/>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="actions">
</g>
</svg>
我编写了以下 PHP 代码来提取 ID 不匹配或部分匹配的第一级元素 lineart.
<?php
$thisEntryDoc = new DOMDocument();
$thisEntryDoc->load('test.svg');
$xpath = new DOMXpath($thisEntryDoc);
$xpath->registerNamespace('svg', "http://www.w3.org/1999/xlink");
$elements = $xpath->query("//svg:svg/svg:g[not(contains(@id, 'lineart'))]");
foreach($elements as $element) {
echo "Found {$element->nodeName}\n";
}
?>
这不会产生任何结果。我已经使用在线工具测试了 XPath,它运行良好。唯一能产生任何结果的表达式是 //*
。
我完全莫名其妙。有谁知道为什么经过验证的 XPath 表达式根本不起作用?
我认为您的命名空间注册有误。
这是 xlink
命名空间,不是默认命名空间:
$xpath->registerNamespace('svg', "http://www.w3.org/1999/xlink");
大概应该是:
$xpath->registerNamespace( 'svg', "http://www.w3.org/2000/svg" );