Я не могу извлечь текст узла с помощью Xpath - PullRequest
0 голосов
/ 08 июня 2018

У меня есть XML-файл (test.xml), подобный этому:

<?xml version="1.0" encoding="ISO-8859-1"?>
<s2xResponse>
  <s2xData>
    <Name>This is the name</Name>
    <InfocomData>
      <DateOfUpdate day="07" month="02" year="2018">20180207</DateOfUpdate>
      <CompanyName>MY COMPANY</CompanyName>
      <TaxCode FlagCheck="0">XXXYYYWWWZZZ</TaxCode>
    </InfocomData>
    <AssessmentSummary>
      <Rating Code="2">Rating Description for Code 2</Rating>
    </AssessmentSummary>
    <AssessmentData>
      <SectorialDistribution>
        <CompaniesNumber>11650</CompaniesNumber>
        <ScoreDistribution />
        <CervedScoreDistribution>
          <DistributionData>
            <Rating Code="1">SICUREZZA</Rating>
            <Percentage>1.91</Percentage>
          </DistributionData>
          <DistributionData>
            <Rating Code="2">SOLVIBILITA' ELEVATA</Rating>
            <Percentage>35.56</Percentage>
          </DistributionData>
        </CervedScoreDistribution>
      </SectorialDistribution>
    </AssessmentData>
  </s2xData>
</s2xResponse>

Я пытаюсь получить текст узла «Имя» («Это имя») с U-Сценарий SQL с использованием XmlExtractor.Ниже приведен код, который я использую:

USE TestXML; // It contains the registered assembly

REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

@xml = EXTRACT xml_text string
       FROM "textxpath/test.xml"
       USING Extractors.Text(rowDelimiter: "^", quoting: false);

@xml_cleaned =
    SELECT
        xml_text.Replace("\r\n", "").Replace("\t", "    ") AS xml_text
    FROM @xml;

@values =
    SELECT Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate(xml_text, "s2xResponse/s2xData/Name")[1] AS value
    FROM @xml_cleaned;


OUTPUT @values TO @"outputs/test_xpath.txt" USING Outputters.Text(quoting: false);

Но я получаю эту ошибку времени выполнения:

Выполнение завершилось с ошибкой '1_SV1_Extract Error:' {"диагностика-код": 195887116, "severity": "Error", "component": "RUNTIME", "source": "User", "errorId": "E_RUNTIME_USER_EXPRESSIONEVALUATION", "message": "Ошибка при оценке выражения Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate (xml_text.Replace (\ "\ r \ n \", \ "\"). Заменить (\ "\ t \", \ "\"), \ "s2xResponse / s2xData / Name \") [1]", "description": "Внутреннее исключение из выражения пользователя: индекс находится вне диапазона. Должен быть неотрицательным и меньше размера коллекции.

Я получаюта же ошибка, даже если я использую нулевой индекс для результата оценки ([0]).

Что не так с моим запросом?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Есть ли конкретная причина, по которой вы хотите использовать метод Evaluate?Я заставил его работать, используя XmlDomExtractor, который позволил бы вам извлечь несколько значений из XML, например,

REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

DECLARE @inputFile string = "/input/input100.xml";

@input =
    EXTRACT Name string
    FROM @inputFile
    USING new Microsoft.Analytics.Samples.Formats.Xml.XmlDomExtractor(rowPath : "/s2xResponse",
          columnPaths : new SQL.MAP<string, string>{
          { "s2xData/Name", "Name" },
          }
          );


@output =
    SELECT *
    FROM @input;
0 голосов
/ 08 июня 2018

Проблема здесь в том, что вы применяете индекс [1] к результату XPath.Evaluate, который, я думаю, будет возвращать узлы Name.Однако вы применяете индекс [1] в коде, а не в XPath, поэтому индекс, скорее всего, будет основан на нуле, а не на 1, как в XPath, следовательно, ошибка Index out of range.

Вот одно из решений - просто примените оператор индекса в Xpath (где он все еще основан на 1) и выберите text() там

 .Evaluate("s2xResponse/s2xData/Name[1]/text()")
...