2015-12-28 45 views
0

我從許多來源生成XML文件。我現在面臨的問題是,我從Soap Webservice和其他應用程序生成的另一個XML文件提供新的XML。由於webservice中的xml返回了一個命名空間前綴,我需要從soap webservice中刪除前綴或從soap webservice獲取命名空間前綴,並將其添加到其他應用程序生成的XML中。從不同來源生成的混合XML + PHP Xpath

例如,來自皁web服務:

<s:element1></s:element1> 

從其它應用程序:

<element2></element2> 

,我需要有一個XML生成這樣的:

<element1></element1> 
<element2></element2> 

<s:element1></s:element1> 
<s:element2></s:element2> 

我認爲第一種方法會更容易。

我想使用正則表達式,但不知道爲什麼它聽起來不好。

我正在使用XPath生成新生成的XML文件。

謝謝!

回答

1

不,您不需要刪除或更改命名空間前綴。命名空間很重要,前綴不是。它們只是使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) 
+0

THW你好,謝謝!我認爲 - 只是想 - 我明白你的解釋。 但我無法正常工作:http://pastebin.ca/3307776 我已經在元素中定義了命名空間。你是我做錯了什麼? –

+0

幾件事情:您沒有在源xml中定義名稱空間,名稱空間是URI,而不是簡單的字符串,您還需要註冊Xpath表達式的前綴。 https://eval.in/495445 – ThW

+0

我想我需要閱讀更多關於這個問題。感謝您的努力和幫助! –