Как решить проблему с порядком элементов XML? - PullRequest
0 голосов
/ 23 мая 2019

Я использую Google AdWords WSDL и мыло.

Я обнаружил, что порядок элементов xml важен.

Вот мой объект запроса:

  const reportDef: IReportDefinition = {
      // order is matter
      dateRangeType: _.get(reportDefinition, 'dateRangeType', ReportDefinition.DateRangeType.ALL_TIME),
      selector: {
        fields: CampaignPerformanceReportService.selectorFields,
      },
      reportName: CampaignPerformanceReportService.reportName,
      reportType: ReportDefinition.ReportType.CAMPAIGN_PERFORMANCE_REPORT,
    };

И, используя xml2js builder, преобразуйте этот объект в XML:

 const builder = new xml2js.Builder();
 builder.buildObject(obj);
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <reportDefinition>
          <dateRangeType>YESTERDAY</dateRangeType>
          <selector>
            <fields>CampaignId</fields>
            <fields>CampaignName</fields>
            <fields>CampaignStatus</fields>
            <fields>StartDate</fields>
            <fields>EndDate</fields>
            <fields>Clicks</fields>
            <fields>Conversions</fields>
            <fields>Ctr</fields>
            <fields>Cost</fields>
            <fields>Impressions</fields>
            <fields>ConversionRate</fields>
            <fields>AverageCpc</fields>
          </selector>
          <reportName>Campaign Performance Report</reportName>
          <reportType>CAMPAIGN_PERFORMANCE_REPORT</reportType>
          <downloadFormat>XML</downloadFormat>
        </reportDefinition>

Затем отправьте этот запрос, но получили ошибку:

StatusCodeError: 400 - "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><reportDownloadError><ApiError><type>ReportDownloadError.INVALID_REPORT_DEFINITION_XML</type><trigger>Invalid ReportDefinition Xml: cvc-complex-type.2.4.a: Invalid content was found starting with element '{\"https://adwords.google.com/api/adwords/cm/v201809\":dateRangeType}'. One of '{\"https://adwords.google.com/api/adwords/cm/v201809\":id, \"https://adwords.google.com/api/adwords/cm/v201809\":selector}' is expected.</trigger><fieldPath></fieldPath></ApiError></reportDownloadError>"

Когда я ставлю поле dataRangeType до последнего. Как:

 const reportDef: IReportDefinition = {
      // order is matter
      selector: {
        fields: CampaignPerformanceReportService.selectorFields,
      },
      reportName: CampaignPerformanceReportService.reportName,
      reportType: ReportDefinition.ReportType.CAMPAIGN_PERFORMANCE_REPORT,
      dateRangeType: _.get(reportDefinition, 'dateRangeType', ReportDefinition.DateRangeType.ALL_TIME),
    };

Преобразованный XML - это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <reportDefinition>
      <selector>
        <fields>CampaignId</fields>
        <fields>CampaignName</fields>
        <fields>CampaignStatus</fields>
        <fields>StartDate</fields>
        <fields>EndDate</fields>
        <fields>Clicks</fields>
        <fields>Conversions</fields>
        <fields>Ctr</fields>
        <fields>Cost</fields>
        <fields>Impressions</fields>
        <fields>ConversionRate</fields>
        <fields>AverageCpc</fields>
      </selector>
      <reportName>Campaign Performance Report</reportName>
      <reportType>CAMPAIGN_PERFORMANCE_REPORT</reportType>
      <dateRangeType>YESTERDAY</dateRangeType>
      <downloadFormat>XML</downloadFormat>
    </reportDefinition>

Тогда я могу получить правильный ответ:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <report>
      <report-name name='Campaign Performance Report'/>
      <date-range date='May 22, 2019'/>
    </report>

Итак, как мне решить проблему с порядком элементов xml? Я не знаю, в каком порядке должен быть элемент xml. Я должен попытаться отсортировать свойства снова и снова.

Это лучший способ справиться с этим?

...