Как извлечь значения атрибутов из элемента XML с помощью XML Extractor в U-SQL

Как я могу извлечь значение атрибута из элемента XML с помощью XML Экстрактор на U-SQL для моей работы по анализу озера данных Azure.

Обновление: дополнительные сведения о проблеме

Мой XML-файл выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<testelement testatr="xyz">
</testelement>

Вот мой сценарий U-SQL:

DECLARE @testfile string = "sample2.xml";
@logText =
EXTRACT log string            
FROM @testfile
USING Extractors.Tsv();

@gethID = SELECT Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate(@logText.log, "testelement/attribute::testatr").ElementAt(0) AS siteName FROM @logText;
OUTPUT @gethID TO "result.out" USING Outputters.Tsv(); 

После отладки я заметил, что при попытке загрузить метод Load класса XPath возникло исключение:

"<?xml version=1.0 encoding=utf-8?>"

Вот исключение:

Microsoft.Cosmos.ScopeStudio.BusinessObjects.Debugger.ScopeDebugException was unhandled
Message: An unhandled exception of type 'Microsoft.Cosmos.ScopeStudio.BusinessObjects.Debugger.ScopeDebugException' occurred in Microsoft.Cosmos.ScopeStudio.BusinessObjects.Debugger.dll
Additional information: {"diagnosticCode":195887111,"severity":"Error","component":"RUNTIME","source":"User","errorId":"E_RUNTIME_USER_EXPRESSIONEVALUATION","message":"Error while evaluating expression Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate(log, \"testelement/attribute::testatr\").ElementAt(0)","description":"Inner exception from user expression: '1.0' is an unexpected token. The expected token is '\"' or '''. Line 1, position 15.\nCurrent row dump: \tlog:\t\"<?xml version=1.0 encoding=utf-8?>\"
\n","resolution":"","helpLink":"","details":"==== Caught exception System.Xml.XmlException\n\n   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
\n   at System.Xml.XmlTextReaderImpl.ParseXmlDeclaration(Boolean isTextDecl)
\n   at System.Xml.XmlTextReaderImpl.Read()
\n   at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
\n   at System.Xml.XmlDocument.Load(XmlReader reader)
\n   at System.Xml.XmlDocument.LoadXml(String xml)
\n   at Microsoft.Analytics.Samples.Formats.Xml.XPath.Load(String xml)
\n   at Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate(String xml, String xpath)
\n   at ___Scope_Generated_Classes___.SqlFilterTransformer_2.Process(IRow row, IUpdatableRow output) in c:\\workarea\\bswbigdata\\USQLAppForLogs\\USQLAppForLogs\\bin\\Debug\\A06D46624BBA798\\ReadBlobs.usql.Debug_A54F30D359F939C7\\__ScopeCodeGen__.dll.cs:line 53","internalDiagnostics":""}

Обновление 2:

После использования цитаты: false я получаю еще одно исключение:

Microsoft.Cosmos.ScopeStudio.BusinessObjects.Debugger.ScopeDebugException was unhandled
Message: An unhandled exception of type 'Microsoft.Cosmos.ScopeStudio.BusinessObjects.Debugger.ScopeDebugException' occurred in Microsoft.Cosmos.ScopeStudio.BusinessObjects.Debugger.dll
Additional information: {"diagnosticCode":195887111,"severity":"Error","component":"RUNTIME","source":"User","errorId":"E_RUNTIME_USER_EXPRESSIONEVALUATION","message":"Error while evaluating expression Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate(log, \"testelement/attribute::testatr\").ElementAt(0)","description":"Inner exception from user expression: Root element is missing.\nCurrent row dump: \tlog:\t\"<?xml version=\"1.0\" encoding=\"utf-8\"?>\"
\n","resolution":"","helpLink":"","details":"==== Caught exception System.Xml.XmlException\n\n   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
\n   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
\n   at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
\n   at System.Xml.XmlDocument.Load(XmlReader reader)
\n   at System.Xml.XmlDocument.LoadXml(String xml)
\n   at Microsoft.Analytics.Samples.Formats.Xml.XPath.Load(String xml)
\n   at Microsoft.Analytics.Samples.Formats.Xml.XPath.Evaluate(String xml, String xpath)
\n   at ___Scope_Generated_Classes___.SqlFilterTransformer_2.Process(IRow row, IUpdatableRow output) in c:\\workarea\\bswbigdata\\USQLAppForLogs\\USQLAppForLogs\\bin\\Debug\\A06D46624BBA798\\ReadBlobs.usql.Debug_A54F30D359F939C7\\__ScopeCodeGen__.dll.cs:line 53","internalDiagnostics":""}

person Jamil    schedule 05.01.2016    source источник


Ответы (2)


Вы идентифицируете значения с помощью выражений XPath. Атрибут запрашивается с @attr_name (или выражением полной оси attribute::attr_name).

ОБНОВЛЕНИЕ на основе обновления вопроса:

Похоже, что синтаксический анализатор каким-то образом сбивается с толку из-за «внутри XML-объявления. Я вижу, что вы используете встроенный извлекатель Tsv (), который по умолчанию в настоящее время обрабатывает« внутри поля как символ цитирования, а затем отбрасывает его. Это ошибка, которую мы планируем исправить.

А пока я предлагаю вам использовать Extractors.Tsv(quoting:false).

Также убедитесь, что ваш XML-документ не содержит CR / LF, если вы используете какой-либо из встроенных экстракторов текста (Extractors.*), и что он не содержит значения табуляции, если вы используете .Tsv.

Если ваш XML будет содержать CR и / или LF, вам придется использовать специальный экстрактор, чтобы использовать другой разделитель строк. Если вам нужно это сделать, оставьте мне сообщение, потому что в настоящее время я отслеживаю такие запросы, чтобы увидеть, что мы можем улучшить во встроенных экстракторах.

Если ваш файл содержит только один XML-документ (в отличие от нескольких строк XML-документов), я бы предложил использовать XML-экстрактор, который также является частью образца XML на GitHub.

person Michael Rys    schedule 05.01.2016
comment
Спасибо, Майкл, я попробовал этот подход, но получил исключение. См. Обновленные подробности вопросов. - person Jamil; 06.01.2016
comment
Спасибо, Джамиль. Я обновил свой ответ с учетом ваших дополнительных сведений. - person Michael Rys; 06.01.2016

В новом сообщении об ошибке: похоже, что XML-документ содержит CR или LF или оба сразу после объявления XML, и, таким образом, экстрактор Tsv () разбивает XML-документ. См. Мой комментарий в предыдущем ответе:

Также убедитесь, что ваш XML-документ не содержит CR / LF, если вы используете какие-либо встроенные экстракторы текста (Extractors. *), И что он не содержит значения табуляции, если вы используете .Tsv.

Если ваш XML будет содержать CR и / или LF, вам придется использовать специальный экстрактор, чтобы использовать другой разделитель строк. Если вам нужно это сделать, оставьте мне сообщение, потому что в настоящее время я отслеживаю такие запросы, чтобы увидеть, что мы можем улучшить во встроенных экстракторах.

person Michael Rys    schedule 06.01.2016
comment
Итак, я думаю, в настоящее время у меня нет никакого решения в экстракторах по умолчанию для получения значения атрибута из XML, содержащего CR / LF, верно? - person Jamil; 07.01.2016
comment
Верный. Вместо этого вам следует использовать экстракторы, предоставленные в библиотеке образцов. Или удалите CR / LF (если они являются так называемыми несущественными пробелами в XML). - person Michael Rys; 07.01.2016
comment
Привет @ michael-rys! Не могли бы вы привести мне пример экстракторов xaml, представленных в библиотеке примеров для извлечения значения атрибута из XML? Я вижу пример извлечения значения элемента, но не значения атрибута. - person Jamil; 15.01.2016
comment
Привет, Джамиль ... вы пытались написать @name для ссылки на атрибут (вместо name для ссылки на элемент)? - person Michael Rys; 15.01.2016