【问题标题】:Nested XML : How to show, data present in nested XML on HTML page, dynamically嵌套 XML:如何动态显示 HTML 页面上嵌套 XML 中的数据
【发布时间】: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 中哪个表在哪个级别?

更多信息:

  1. DataSet 中的 DataTable 还包含关系 dataTable.ChildRelations
  2. 会自动在父表和子表中添加新列以建立关系。 我们如何区分自动添加的列和原始列?

【问题讨论】:

    标签: c# html xml asp.net-core model-view-controller


    【解决方案1】:

    我们可以使用下面的代码来实现它

     @foreach (DataTable table in Model.DtSourcePreview.Tables)
                              {
                                  if (IsParent(Model.DtSourcePreview, table))
                                  {
                                      @CreateTableChild(Model.DtSourcePreview, table);
                                  }
                             }
    

    方法是

     public bool IsParent(DataSet dataSet, DataTable dataTable)
                {
                    bool isParent = true;
    
                    if (dataSet.Relations.Count > 0)
                    {
                        foreach (var abc in dataSet.Relations)
                        {
                            if (((DataRelation)abc).ChildTable.TableName == dataTable.TableName)
                            {
                                isParent = false;
                            }
                        }
                    }
                    else
                    {
                        isParent = true;
                    }
    
                    return isParent;
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多