【发布时间】:2020-12-29 15:13:49
【问题描述】:
要求: 用户可以提供任何 XML 文件(连同包含 XML 文件架构的 XSD 文件)具有数据。我需要在 asp.net 核心网站上显示“数据预览”,还需要将 XML 的 Schema 保存在数据库中的层次结构中(将 XML 中存在的所有字段保存在 DB 表中)。
目前的做法: 在 asp.net 核心网站中,我有一个 Controller 和相应的 Action。 在 View.cshtml 上,我有两个“文件”控件来从用户那里获取“XML 文件”和“XSD 文件”。
XSD 文件示例
<?xml version="1.0"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="PM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Employee_Level1">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Id" type="xs:string" />
<xs:element minOccurs="0" name="Company" type="xs:string" />
<xs:element minOccurs="0" name="Gender" type="xs:string" />
<xs:element minOccurs="0" name="Email" type="xs:string" />
<xs:element minOccurs="0" name="Account">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="BankName" type="xs:string" />
<xs:element minOccurs="0" name="AccountNo" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="Payment_Level1">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Company" type="xs:string" />
<xs:element minOccurs="0" name="PaymentNo" type="xs:string" />
<xs:element minOccurs="0" name="Currency" type="xs:string" />
<xs:element minOccurs="0" name="Amount" type="xs:string" />
<xs:element minOccurs="0" name="Attribute">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="AttributeName" type="xs:string" />
<xs:element minOccurs="0" name="AttributeContent" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="PaidPayment_Level1">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Company" type="xs:string" />
<xs:element minOccurs="0" name="PaymentNo" type="xs:string" />
<xs:element minOccurs="0" name="Currency" type="xs:string" />
<xs:element minOccurs="0" name="Amount" type="xs:string" />
<xs:element minOccurs="0" name="Attribute">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="AttributeName" type="xs:string" />
<xs:element minOccurs="0" name="AttributeContent" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
对应这个XSD文件的XML文件是
<?xml version="1.0" encoding="UTF-8"?>
<RootTop xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Employee_Level1>
<Id>GS1</Id>
<Company>Apple</Company>
<Gender>Male</Gender>
<Email>Apple@Apple.com</Email>
<Account>
<BankName>Axis</BankName>
<AccountNo>4235</AccountNo>
</Account>
</Employee_Level1>
<Employee_Level1>
<Id>GS2</Id>
<Company>Amazone</Company>
<Gender>Male</Gender>
<Email>Amazone@Amazone.com</Email>
<Account>
<BankName>HDFC</BankName>
<AccountNo>123</AccountNo>
</Account>
</Employee_Level1>
<Payment_Level1>
<Company>Apple</Company>
<PaymentNo>1813424</PaymentNo>
<Currency>RS</Currency>
<Amount>60.15</Amount>
<Attribute>
<AttributeName>Discount</AttributeName>
<AttributeContent>15</AttributeContent>
</Attribute>
</Payment_Level1>
<Payment_Level1>
<Company>Amazone</Company>
<PaymentNo>7643</PaymentNo>
<Currency>EUR</Currency>
<Amount>17849.15</Amount>
<Attribute>
<AttributeName>Discount</AttributeName>
<AttributeContent>12</AttributeContent>
</Attribute>
</Payment_Level1>
<PaidPayment_Level1>
<Company>Apple</Company>
<PaymentNo>41</PaymentNo>
<Currency>EUR</Currency>
<Amount>17849.15</Amount>
<Attribute>
<AttributeName>Discount</AttributeName>
<AttributeContent>13</AttributeContent>
</Attribute>
</PaidPayment_Level1>
<PaidPayment_Level1>
<Company>Amazone</Company>
<PaymentNo>56</PaymentNo>
<Currency>EUR</Currency>
<Amount>68.15</Amount>
<Attribute>
<AttributeName>Discount</AttributeName>
<AttributeContent>13</AttributeContent>
</Attribute>
</PaidPayment_Level1>
<PaidPayment_Level1>
<Company>EMM-NL</Company>
<PaymentNo>1813424</PaymentNo>
<Currency>EUR</Currency>
<Amount>17849.15</Amount>
<Attribute>
<AttributeName>Discount</AttributeName>
<AttributeContent>1515</AttributeContent>
</Attribute>
</PaidPayment_Level1>
</RootTop>
我正在使用以下代码从 c# 中的 XML 文件读取数据并在 DataSet 中加载数据/模式。
public static DataSet CreateDataTableFromXmlFile(byte[] xsdFileContent, byte[] xmlFileContent)
{
DataSet ds = new DataSet();
ds.ReadXmlSchema(new MemoryStream(xsdFileContent));
foreach (DataTable tab in ds.Tables)
{
tab.BeginLoadData();
}
ds.ReadXml(new MemoryStream(xmlFileContent));
foreach (DataTable tab in ds.Tables)
{
tab.EndLoadData();
}
return ds;
}
一旦数据进入数据集中,我们就会以表格的形式呈现所有数据。
使用代码在 UI 上显示数据
<div>
@foreach (DataTable table in Model.DtSourcePreview.Tables)
{
@CreateTableChild(table);
}
</div>
@functions
{
public string CreateTableChild(DataTable table)
{
<table class="table mb-0">
<thead>
<tr>
@foreach (DataColumn col in table.Columns)
{
<th scope="col">@col.ColumnName</th>
}
</tr>
</thead>
<tbody>
@foreach (DataRow row in table.Rows)
{
<tr>
@foreach (DataColumn col in table.Columns)
{
<td>@row[col.ColumnName]</td>
}
</tr>
}
</tbody>
</table>
return "";
}
}
使用此 cshtml 代码,我可以在 UI 上显示所有表格,但数据未按分层顺序显示。例如,Account 表包含所有(所有员工的)账户,但我们需要在每个对应的 Employee 下方显示账户。 我们如何才能做到这一点?
如何获取 XML 中哪个表在哪个级别?
更多信息:
- DataSet 中的 DataTable 还包含关系 dataTable.ChildRelations
- 会自动在父表和子表中添加新列以建立关系。 我们如何区分自动添加的列和原始列?
【问题讨论】:
标签: c# html xml asp.net-core model-view-controller