2012-12-12 263 views
1

時創建空我有這個XML文件:xmlns屬性添加元素

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<S2SDDIdf:MPEDDIdfBlkDirDeb xmlns:S2SDDIdf="urn:S2SDDIdf:xsd:$MPEDDIdfBlkDirDeb" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="urn:S2SDDIdf:xsd:$MPEDDIdfBlkDirDeb MPEDDIdfBlkDirDeb.xsd"> 

    <S2SDDIdf:SndgInst>CHASDEFX</S2SDDIdf:SndgInst> 
    <S2SDDIdf:RcvgInst>BOFIIE2D</S2SDDIdf:RcvgInst> 
    <S2SDDIdf:pacs.003.001.01 xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.01"> 


    </S2SDDIdf:pacs.003.001.01> 
</S2SDDIdf:MPEDDIdfBlkDirDeb> 

我加入元素下S2SDDIdf這個元素:pacs.003.001.01:

<DrctDbtTxInf> 
    <PmtId> 
     <EndToEndId>DDIE2EA00033</EndToEndId> 
     <TxId>DDITXA00033</TxId> 
    </PmtId> 
</DrctDbtTxInf> 

下面是代碼:

// Read pacs.003.001.01 element 
XElement bulk = XElement.Parse(File.ReadAllText("_Bulk.txt")); 

// Read DrctDbtTxInf element 
XElement tx = XElement.Parse(File.ReadAllText("_Tx.txt")); 

// Add DrctDbtTxInf element to pacs.003.001.01 element 
bulk.Element("{urn:S2SDDIdf:xsd:$MPEDDIdfBlkDirDeb}pacs.003.001.01").Add(tx); 

的問題是,元件DrctDbtTxInf得到一個空xmlns屬性:

<DrctDbtTxInf xmlns=""> 

如何擺脫它?我試圖提供與DrctDbtTxInf元素中的pacs.003.001.01相同的命名空間,但它只是停留在那裏,會破壞讀取xml的應用程序。

+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

4

是的,你需要提供命名空間recursivly所有新元素:

public static class Extensions 
{ 
    public static XElement SetNamespaceRecursivly(this XElement root, 
                XNamespace ns) 
    { 
     foreach (XElement e in root.DescendantsAndSelf()) 
     { 
      if (e.Name.Namespace == "") 
       e.Name = ns + e.Name.LocalName; 
     } 

     return root;  
    } 
} 


XNamespace ns = "urn:iso:std:iso:20022:tech:xsd:pacs.003.001.01"; 

// Add DrctDbtTxInf element to pacs.003.001.01 element 
bulk.Element("{urn:S2SDDIdf:xsd:$MPEDDIdfBlkDirDeb}pacs.003.001.01") 
    .Add(tx.SetNamespaceRecursivly(ns)); 

這將導致以下XML:

<S2SDDIdf:MPEDDIdfBlkDirDeb xmlns:S2SDDIdf="urn:S2SDDIdf:xsd:$MPEDDIdfBlkDirDeb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:S2SDDIdf:xsd:$MPEDDIdfBlkDirDeb MPEDDIdfBlkDirDeb.xsd"> 
    <S2SDDIdf:SndgInst>CHASDEFX</S2SDDIdf:SndgInst> 
    <S2SDDIdf:RcvgInst>BOFIIE2D</S2SDDIdf:RcvgInst> 
    <S2SDDIdf:pacs.003.001.01 xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.003.001.01"> 
    <DrctDbtTxInf> 
     <PmtId> 
     <EndToEndId>DDIE2EA00033</EndToEndId> 
     <TxId>DDITXA00033</TxId> 
     </PmtId> 
    </DrctDbtTxInf> 
    </S2SDDIdf:pacs.003.001.01> 
</S2SDDIdf:MPEDDIdfBlkDirDeb> 
+0

這導致收到該文件的應用程序出現問題。它目前收到的文件中沒有添加'S2SDDIdf:'並將其打破。 – Yoav

+0

@Yoav:對不起,我的錯。我使用了錯誤的名稱空間。請再檢查一次。 –

+0

謝謝,這就是工作。如果我可以向我介紹這種「擴展」模式,我會給出另一個+1。 – Yoav