2016-01-07 54 views
0

如何爲我的XML的每個元素添加前綴。如何爲XML的每個元素添加前綴

所以一般從這樣的XML:

<CLASSXml> 
    <CalculationIndex> 
     <RunDesc>NormalCalc</RunDesc> 
    </CalculationIndex> 
    <GlobalData> 
     <CalcIdent> 
      <CalcUId>CLASS:20160105:09411486:000007773000:203:CS:CZK:349074</CalcUId> 
      <CalcNo>2454307119</CalcNo> 
      <CustomNo>349074</CustomNo> 
      <CalcVer>2300</CalcVer> 
      <XMLVer>23.00.01</XMLVer> 
      <Detail> 
       <Current>1123</Current> 
       <Last>1152</Last> 
      </Detail> 
      <ClassBuild>23.00.04.03</ClassBuild> 
      <SAXIFVersion>6.2</SAXIFVersion> 
      <SystemDat>2016-01-05</SystemDat> 
      <TimeStamp>09:41:14.86</TimeStamp> 
      <ProdMasterVer>0</ProdMasterVer> 
     </CalcIdent> 
    </GlobalData> 
</CLASSXml> 

做這樣的事情:

<ns2:CLASSXml> 
    <ns2:CalculationIndex> 
     <ns2:RunDesc>NormalCalc</ns2:RunDesc> 
    </ns2:CalculationIndex> 
    <ns2:GlobalData> 
     <ns2:CalcIdent> 
      <ns2:CalcUId>CLASS:20160105:09411486:000007773000:203:CS:CZK:349074</ns2:CalcUId> 
      <ns2:CalcNo>2454307119</ns2:CalcNo> 
      <ns2:CustomNo>349074</ns2:CustomNo> 
      <ns2:CalcVer>2300</ns2:CalcVer> 
      <ns2:XMLVer>23.00.01</ns2:XMLVer> 
      <ns2:Detail> 
       <ns2:Current>1123</ns2:Current> 
       <ns2:Last>1152</ns2:Last> 
      </ns2:detail> 
      <ns2:ClassBuild>23.00.04.03</ns2:ClassBuild> 
      <ns2:SAXIFVersion>6.2</ns2:SAXIFVersion> 
      <ns2:SystemDat>2016-01-05</ns2:SystemDat> 
      <ns2:TimeStamp>09:41:14.86</ns2:TimeStamp> 
      <ns2:ProdMasterVer>0</ns2:ProdMasterVer> 
     </ns2:CalcIdent> 
    </ns2:GlobalData> 
</ns2:CLASSXml> 

我知道有可能做這樣的事情與str_replace函數(如下面的例子),但如果XML變成500行長或類似的東西,那麼這些代碼就是無用的代碼。

任何想法如何做到這一點很簡單?

public function addNameSpace($xml) { 
    $xml = str_replace('<CLASSXml>', '<ns2:CLASSXml>', $xml); 
    $xml = str_replace('</CLASSXml>', '</ns2:CLASSXml>', $xml); 
    $xml = str_replace('<CalculationIndex>', '<ns2:CalculationIndex>', $xml); 
    $xml = str_replace('</CalculationIndex>', '</ns2:CalculationIndex>', $xml); 

    // What to do? 
} 

回答

2

在PHP中使用正則表達式,這將是非常容易

$xmlString = preg_replace('/(?<=\<)([^\/].*?)(?=\>)/', 'ns2:$1', $xmlString); // for <test> 
$xmlString = preg_replace('/(?<=\<\/)(.*?)(?=\>)/', 'ns2:$1', $xmlString); // for </test> 

其中$的xmlString是你的XML內容。

你的功能

public function addNameSpace($xml) 
{ 
    $xml = preg_replace('/(?<=\<)([^\/].*?)(?=\>)/', 'ns2:$1', $xml); 
    $xml = preg_replace('/(?<=\<\/)(.*?)(?=\>)/', 'ns2:$1', $xml); 
    . 
    . 
} 

或建議:針對不同的命名空間

public function addNameSpace($xml, $namespace) 
{ 
    $xml = preg_replace('/(?<=\<)([^\/].*?)(?=\>)/', $namespace.'$1', $xml); 
    $xml = preg_replace('/(?<=\<\/)(.*?)(?=\>)/', $namespace.'$1', $xml); 
    . 
    . 
} 
+0

這工作嗎? – Vegeta

+0

嗨@Vegeta,謝謝你的回答,正則表達式可能真的有幫助。 但是,如果我可以有問題2件事 1th - 上面的代碼返回 NormalCalc 所以斜槓是在前綴後面而不是在結束標記之前 2th - 我相信這不適用於具有屬性的元素我是對嗎? – Andurit

+0

嗨@Vegeta,真的不需要爲「錯誤」的答案感到抱歉,即使是第一個你帶領我的好方法。我沒有回答,因爲我正在檢查這個。我發現小mystake,也許這導致問題。我們是否可以在聊天中開始討論鐵餅,然後你就回來在這裏編輯答案? 它是爲你準備的嗎? http://chat.stackoverflow.com/rooms/100042/how-to-add-prefix-to-each-element-of-xml – Andurit

0

現在要在其上使用的技術.. 有春天的方法,可以在其中添加前綴每個元素...

marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() { 
      @Override 
      public String getPreferredPrefix(String arg0, String arg1, boolean arg2) { 
       return "ns1"; 
      } 
     });' 

還有另一種方法可以做這

@XmlSchema(
    namespace = "http://www.example.com/a", 
    elementFormDefault = XmlNsForm.QUALIFIED, 
    xmlns = { 
     @XmlNs(prefix="ns1", namespaceURI="http://www.example.com/a") 
    } 
) 

package authenticator.beans.login; 
import javax.xml.bind.annotation.*; 
+0

讓我知道它是否可行 –

+0

您好庫納爾甘特拉,我appriciate你的答案,但我有這在PHP不是JAVA :(所以SPRINT對我來說不是有幫助的 無論如何,再次感謝 – Andurit