不,您不需要刪除或更改命名空間前綴。命名空間很重要,前綴不是。它們只是使XML更易於閱讀的別名。
以下示例顯示3個不同的xmls,它們全部解析爲名稱空間urn:example
中的本地名稱foo
的元素節點。
$xmls = [
'<f:foo xmlns:f="urn:example"/>',
'<bar:foo xmlns:bar="urn:example"/>',
'<foo xmlns="urn:example"/>'
];
foreach ($xmls as $xml) {
$document = new DOMDocument();
$document->loadXml($xml);
var_dump(
$document->documentElement->localName,
$document->documentElement->namespaceURI
);
}
輸出:
string(3) "foo"
string(11) "urn:example"
string(3) "foo"
string(11) "urn:example"
string(3) "foo"
string(11) "urn:example"
所以該信息是在每個節點提供。如果您將節點導入到文檔中,它將爲其帶來名稱空間,並保留信息。
$xmls = [
'<f:foo xmlns:f="urn:example"/>',
'<bar:foo xmlns:bar="urn:example"/>',
'<foo xmlns="urn:example"/>'
];
$target = new DOMDocument();
$target->loadXml('<f:foo xmlns:f="urn:example"/>');
foreach ($xmls as $xml) {
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('e', 'urn:example');
$target->documentElement->appendChild(
$target->importNode($xpath->evaluate('/e:foo')->item(0), TRUE)
);
}
echo $target->saveXml(), "\n\n";
輸出:
<?xml version="1.0"?>
<f:foo xmlns:f="urn:example"><f:foo/><bar:foo xmlns:bar="urn:example"/><f:foo/></f:foo>
XPath的,你必須註冊自己的命名空間前綴。這可以與文檔中的前綴相同或不同。如果做得正確文檔中的命名空間前綴是不相關的:
$xpath = new DOMXpath($target);
$xpath->registerNamespace('e', 'urn:example');
var_dump($xpath->evaluate('count(//e:foo)'));
輸出:
float(4)
來源
2015-12-28 15:11:23
ThW
THW你好,謝謝!我認爲 - 只是想 - 我明白你的解釋。 但我無法正常工作:http://pastebin.ca/3307776 我已經在元素中定義了命名空間。你是我做錯了什麼? –
幾件事情:您沒有在源xml中定義名稱空間,名稱空間是URI,而不是簡單的字符串,您還需要註冊Xpath表達式的前綴。 https://eval.in/495445 – ThW
我想我需要閱讀更多關於這個問題。感謝您的努力和幫助! –