2017-09-26 62 views
0

我試圖通過序列化我的對象到XML構建CDA文件已經存在,這裏的XML部分是害我一些麻煩:XML元素的命名空間「TR」「」是在當前範圍內

<component> 
    <section> 
     <templateId root='2.16.840.1.113883.10.20.1.11'/> 
     <templateId root='1.3.6.1.4.1.19376.1.5.3.1.3.6'/> 
     <!--<id root='' extension=''/>--> 
     <code code="11450-4" displayName="PROBLEM LIST" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/> 
     <title>Active Problem - Problem List</title> 
     <text> 
      <table> 
       <thead> 
        <tr> 
         <th>Problem</th> 
         <th>Code</th> 
         <th>Code System</th> 
         <th>Start Date</th> 
         <th>Status</th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr> 
         <td>Asthma</td> 
         <td>195967001</td> 
         <td>SNOMED CT</td> 
         <td></td> 
         <td>Active</td> 
        </tr> 
        <tr> 
         <td>Costal chondritis</td> 
         <td>64109004</td> 
         <td>SNOMED CT</td> 
         <td></td> 
         <td>Active</td> 
        </tr> 
        <tr> 
         <td>No impairment</td> 
         <td>66557003</td> 
         <td>SNOMED CT</td> 
         <td></td> 
         <td>Active</td> 
        </tr> 
       </tbody> 
      </table> 
     </text> 
    </section> 
</component> 

這裏是我的C#類其序列:

public class Section 
{ 
    [XmlElement("templateId")] 
    public List<IdElement> TemplateIds { get; set; } 
    [XmlElement("code")] 
    public CodeElement Code { get; set; } 
    [XmlElement("title")] 
    public string Title { get; set; } 
    [XmlElement("text")] 
    public Text Text { get; set; } 
} 
public class Text 
{ 
    [XmlElement("table")] 
    public Table.Table Table { get; set; } 

    [XmlArray("list")] 
    [XmlArrayItem("item")] 
    public List<string> List { get; set; } 

    [XmlElement("paragraph")] 
    public List<string> Paragraphs { get; set; } 
} 
public class Table 
{ 
    [XmlElement("thead")] 
    public TRow Header { get; set; } 
    [XmlElement("tbody")] 
    public TRow Body { get; set; } 
} 
public class TRow 
{ 
    [XmlArray(ElementName = "tr", Namespace = "")] 
    [XmlArrayItem("td")] 
    public List<string> RowData { get; set; } 

    [XmlArray(ElementName = "tr", Namespace = "")] 
    [XmlArrayItem("th")] 
    public List<string> HeaderData { get; set; } 
} 

但是當我嘗試現在連載我的CDA對象,它說,該型TR是在命名空間已經存在,所以我想這這種XML表已經存在,但我可以'找到一個正確的做法。 有沒有解決方法來解決這個問題?

這裏的錯誤日誌(沒有堆棧跟蹤):

System.InvalidOperationException:有反射類型 'Project.Cda.Core.ClinicalDocument' 錯誤。 ---> System.InvalidOperationException:有一個錯誤反映了 屬性'組件'。 ---> System.InvalidOperationException:有 反映類型'Project.Cda.Core.Components.BaseComponent'的錯誤。 ---> System.InvalidOperationException:反映屬性'組件'時出錯。 ---> System.InvalidOperationException:有 是反映類型'Project.Cda.Core.Components.Component'的錯誤。 ---> System.InvalidOperationException:反映屬性'Section'時發生錯誤。 ---> System.InvalidOperationException:有 反映類型'Project.Cda.Core.Components.Section'的錯誤。 ---> System.InvalidOperationException:有一個錯誤反映了 屬性'Text'。 ---> System.InvalidOperationException:有一個反映類型'Project.Cda.Core.Components.Text'的錯誤 。 ---> System.InvalidOperationException:反映 屬性「表」的錯誤。 ---> System.InvalidOperationException:有一個反映類型爲「Project.Cda.Core.Components.Table.Table」的 錯誤。 ---> System.InvalidOperationException:有一個錯誤反映了 屬性'標題'。 ---> System.InvalidOperationException:有一個反映類型'Project.Cda.Core.Components.Table.TRow'的錯誤 。 ---> System.InvalidOperationException:有一個錯誤反映了 屬性的'HeaderData'。 ---> System.InvalidOperationException:XML 元素'tr'來自命名空間''已經存在於當前的 範圍內。使用XML屬性爲元素指定另一個XML名稱或命名空間。

+2

在'TRow'你在'RowData'和'HeaderData'上都有'[XmlArray(ElementName =「tr」,Namespace =「」)]''。這是行不通的。 – dbc

+0

@dbc嗯,謝謝,我會嘗試別的。 是我唯一的選擇爲標題和正文數據創建單獨的類嗎? –

+2

這是迄今爲止最簡單的。其他選項包括1)使用['[XmlChoiceIdentifierAttribute]'](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlchoiceidentifierattribute(v = vs.110).aspx)設置指示''子元素是'​​'還是''的'enum'數組。 2)實現['IXmlSerializable'](https://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly)。 (不要這樣做!)3)如圖所示,在'[XmlAnyElement]'屬性中嵌套序列化。 [這裏](https://stackoverflow.com/a/33180709/3744182)。 – dbc

回答

2

,因爲在TRow,你在兩個RowDataHeaderData

[XmlArray(ElementName = "tr", Namespace = "")] 

你所得到的錯誤。這是行不通的 - 你試圖爲兩個不同的屬性指定相同的元素名稱,因此得到你看到的錯誤,即命名空間的XML元素'tr'已經存在於當前作用域中。

此外,您的模型還有一個額外的問題。重複<tbody>中的<tr>元素,但您的數據模型只允許每個物體有一個<tr>元素。

以下修復都通過引入中間TablePart問題來表示任一表中的標題和正文部分:

public class Table 
{ 
    [XmlElement("thead")] 
    public TablePart Header { get; set; } 

    [XmlElement("tbody")] 
    public TablePart Body { get; set; } 
} 

public class TablePart 
{ 
    [XmlElement(ElementName = "tr", Namespace = "")] 
    public List<TableRow> RowData { get; set; } 
} 

public class TableRow 
{ 
    [XmlElement("td")] 
    public List<string> Data { get; set; } 

    [XmlElement("th")] 
    public List<string> Headers { get; set; } 
} 

樣品fiddle