2016-01-05 4 views
3

Comment puis-je extraire la valeur d'attribut de l'élément XML en utilisant XML Extractor dans U-SQL pour mon travail Azure Data Lake Analytic.Comment extraire les valeurs d'attribut d'un élément XML à l'aide de XML Extractor dans U-SQL

Mise à jour: Plus de détails sur la question

Mon fichier XML ressemble à ceci:

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

Voici mon script U-SQL:

Après le débogage j'ai observé , une exception s'est produite lors du chargement de la méthode Load de la classe XPath:

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

Voici une exception:

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":""} 

Mise à jour 2:

Après avoir utilisé citer: faux Je reçois une autre exception:

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":""} 

Répondre

3

Vous identifiez les valeurs avec XPath expressions. Un attribut est interrogé avec @attr_name (ou l'expression d'axe complet attribute::attr_name).

UPDATE basées sur la question mise à jour:

Il ressemble que l'analyseur obtient en quelque sorte confondu par la « dans la déclaration XML Je vois que vous utilisez l'extracteur Tsv() intégré qui par défaut traite actuellement. » à l'intérieur d'un champ comme un caractère de citation, puis le laisse tomber. C'est un bug que nous prévoyons de corriger.

Jusque-là, je vous suggère d'utiliser Extractors.Tsv(quoting:false). Assurez-vous également que votre document XML ne contient aucun CR/LF si vous utilisez l'un des extracteurs de texte intégrés (Extractors.*) et qu'il ne contient pas de valeur de tabulation si vous utilisez .Tsv .

Si votre fichier XML contient CR et/ou LF, vous devrez utiliser un extracteur personnalisé pour utiliser un séparateur de ligne différent. Si vous devez le faire, laissez-moi un message, car je suis actuellement en train de suivre de telles demandes pour voir ce que nous pouvons améliorer dans les extracteurs intégrés.

Si votre fichier ne contient qu'un seul document XML (par opposition à plusieurs lignes de documents XML), je suggère d'utiliser l'extracteur XML qui fait également partie de l'exemple XML sur GitHub.

+0

Merci Michael, j'ai essayé cette approche mais j'ai eu une exception. S'il vous plaît voir les détails des questions mises à jour. – Jamil

+0

Merci Jamil. J'ai mis à jour ma réponse en fonction de vos détails supplémentaires. –

0

Sur le nouveau message d'erreur: Il semble que le document XML contient un CR ou LF ou les deux après la déclaration XML et donc l'extracteur Tsv() scinde le document XML. Voir mon commentaire dans la réponse précédente:

Aussi s'il vous plaît assurez-vous que votre document XML ne contient pas de CR/LF si vous utilisez l'un des extracteurs de texte intégré et qu'il fait (Extracteurs *.) ne contient pas de valeur de tabulation si vous utilisez .Tsv.

Si votre fichier XML contient CR et/ou LF, vous devrez utiliser un extracteur personnalisé pour utiliser un séparateur de ligne différent.Si vous devez le faire, laissez-moi un message, car je suis actuellement en train de suivre de telles demandes pour voir ce que nous pouvons améliorer dans les extracteurs intégrés.

+0

Vous aviez raison, mon XML contient CR/LF. – Jamil

+0

Donc je suppose, actuellement, je n'ai aucune solution dans les extracteurs par défaut pour obtenir la valeur d'attribut de XML qui contient CR/LF, non? – Jamil

+0

Correct. Vous devriez plutôt utiliser les extracteurs fournis dans la bibliothèque d'échantillons. Ou supprimez le CR/LF (si elles sont appelées "espace insignifiant" dans le XML). –