Сгенерировать таблицу (angular) из XML DataSet (ado.net )

#angular #.net-core #syncfusion

#angular #.net-ядро #syncfusion

Вопрос:

Клиент отправляет sql-запрос, который будет выполнен на сервере. Сервер обрабатывает sql, извлекает данные и возвращает их в виде набора данных обратно на сторону клиента. Они представлены в такой форме:

 <?xml version="1.0" encoding="UTF-8"?>
<FlexiDataSet>
   rn
   <Table>
      rn
      <OperatorId>112051</OperatorId>
      rn
      <UserName>112051</UserName>
      rn
      <Name>Vasya  Whitebear</Name>
      rn
      <IsLeftHanded>false</IsLeftHanded>
      rn
      <PinCode>CFCD208495D565EF66E7DFF9F98764DA</PinCode>
      rn
      <OperatorType>SystemUser</OperatorType>
      rn
   </Table>
   rn
   <Table>
      rn
      <OperatorId>114178</OperatorId>
      rn
      <UserName>114178</UserName>
      rn
      <Name>QaLab03Dev owner  QaLab03Dev</Name>
      rn
      <IsLeftHanded>false</IsLeftHanded>
      rn
      <PinCode>CFCD208495D565EF66E7DFF9F98764DA</PinCode>
      rn
      <OperatorType>SystemUser</OperatorType>
      rn
   </Table>
</FlexiDataSet>
  

Важно отметить, что данные не всегда будут поступать в таком виде
потому что клиент может выполнить любой SQL-запрос. Как отобразить этот xml
как таблица в angular?

Ответ №1:

Я нашел решение:

Прежде всего, вам нужна библиотека Angular для преобразования XML-данных в JSON.

Компонент

 public XML_DataSet = 'XML from question';
public tableHeaders = [];
public tableValues = [];

     ngOnInit() {
        this.PrepareData();
      }

      PrepareData() {
        let x = this.XML_DataSet;
        const parser = new DOMParser();
        const xml = parser.parseFromString(x, 'text/xml');
        let json = this.xml2json.xmlToJson(xml); // XML is converted in JSON
        this.tableValues = json['FlexiDataSet']['Table'];
    
        for (let data of this.tableValues) {
          // Extract table headers
          this.tableHeaders = Object.keys(data);
          //Remove #text - unnecessary column
          this.tableHeaders.shift();
          break;
        }
      }
  

HTML

   <div>
    <table>
      <thead>
        <tr>
          <th *ngFor="let header of tableHeaders">
            {{header}}
          </th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let data of tableValues">
          <td *ngFor="let header of tableHeaders">
            {{data[header]}}
          </td>
        </tr>
      </tbody>
    </table>
  </div>
  

CSS

Для стилизации вашей таблицы вы можете воспользоваться руководством по следующей ссылке.

введите описание изображения здесь

Если вы хотите отображать результаты в угловой сетке, измените HTML

   <div>
    <table mat-table #table [dataSource]="tableValues">
      <ng-container *ngFor="let column of tableHeaders" [matColumnDef]="column">
        <mat-header-cell *matHeaderCellDef>{{ column }}</mat-header-cell>
        <mat-cell *matCellDef="let row">{{ row[column] }}</mat-cell>
      </ng-container>
      <mat-header-row *matHeaderRowDef="tableHeaders"></mat-header-row>
      <mat-row *matRowDef="let row; columns: tableHeaders;"></mat-row>
    </table>
  </div>
  

введите описание изображения здесь

Если вы хотите отображать результаты в сетке Syncfusion EJ2, измените логику

HTML

 <div>
  <ejs-grid #grid [dataSource]='tableValues'
            height="100%"
            width='100%'
            [toolbar]='toolbar'
            [searchSettings]='searchOptions'
            [allowFiltering]=true
            [filterSettings]='filterSettings'
            [allowSorting]=true
            [allowPaging]=true
            [pageSettings]='pageSettings'
            [allowGrouping]=true>
  </ejs-grid>
</div>
  

Компонент

   import { SearchSettingsModel, GridComponent } from '@syncfusion/ej2-angular-grids';
  @ViewChild('grid')
  public grid: GridComponent;

  public grid: GridComponent;
  public toolbar: Object[] = ['Search'];
  public searchOptions: SearchSettingsModel = { fields: this.tableHeaders, operator: 'contains', ignoreCase: true };
  public filterSettings: Object = { type: "Menu" };
  public pageSettings: Object = { enableQueryString: true, pageSize: 20 };

SyncFusionGrid() {
    let columns = [];
    for (let data of this.tableHeaders) {
      let column = { field: data, headerText: data };
      columns.push(column);
    }
    this.grid.columns = columns;

    // Set column width
    for (let column of this.grid.columns) {
      column['width'] = '200';
    }
  }
  

Вызовите метод SyncFusionGrid(), когда у нас будут данные, которые нам нужно отобразить. В моем примере это завершение метода PrepareData()

введите описание изображения здесь

Ответ №2:

Вы выполнили почти все шаги для выполнения вашего требования. На последнем шаге вам необходимо создать EJ2 Angular, используя следующую ссылку «Начало работы», и привязать преобразованный источник данных (XML-данные в JSON) к Grid. Пожалуйста, обратитесь к приведенной ниже документации и ссылкам на примеры.

Начало работы:https://ej2.syncfusion.com/angular/documentation/grid/getting-started /

Привязка к локальному источнику данных: https://ej2.syncfusion.com/angular/documentation/grid/data-binding/?no-cache=1#local-data

Пример браузера:https://ej2.syncfusion.com/angular/demos/#/material/grid/default