我正在尝试通过将我的对象序列化为XML来构建CDA文档,这是导致我遇到麻烦的XML部分:
<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'。 ---&GT; System.InvalidOperationException:反映出错 属性'组件'。 ---&GT; System.InvalidOperationException:有 反映类型'Project.Cda.Core.Components.BaseComponent'的错误。 ---&GT; System.InvalidOperationException:反映属性'Components'时出错。 ---&GT; System.InvalidOperationException:那里 是一个反映类型'Project.Cda.Core.Components.Component'的错误。 ---&GT; System.InvalidOperationException:反映属性“Section”时出错。 ---&GT; System.InvalidOperationException:有 反映类型'Project.Cda.Core.Components.Section'的错误。 ---&GT; System.InvalidOperationException:反映出错 财产'文字'。 ---&GT; System.InvalidOperationException:有一个 反映类型'Project.Cda.Core.Components.Text'的错误。 ---&GT; System.InvalidOperationException:反映出错 财产'表'。 ---&GT; System.InvalidOperationException:有一个 反映类型'Project.Cda.Core.Components.Table.Table'的错误。 ---&GT; System.InvalidOperationException:反映出错 财产'标题'。 ---&GT; System.InvalidOperationException:有一个 反映类型'Project.Cda.Core.Components.Table.TRow'的错误。 ---&GT; System.InvalidOperationException:反映出错 属性'HeaderData'。 ---&GT; System.InvalidOperationException:XML 来自命名空间''的元素'tr'已存在于当前 范围。使用XML属性为其指定另一个XML名称或命名空间 元素。
答案 0 :(得分:2)
您收到错误的原因是,在TRow
,您有
[XmlArray(ElementName = "tr", Namespace = "")]
<{1}}和RowData
上的。这不起作用 - 您试图为两个不同的属性指定相同的元素名称,因此得到您看到的错误,即 XML元素&#39; tr&#39;来自命名空间&#39;&#39;已存在于当前范围内。
此外,您的模型还存在其他问题。 HeaderData
内的<tr>
元素重复,但您的数据模型仅允许每个主体使用一个<tbody>
元素。
以下通过引入中间<tr>
来表示表的标题和正文部分来解决这两个问题:
TablePart
示例fiddle。