Afficher des données XML dans un contrôle Winforms
-
09-06-2019 - |
Question
Je souhaite afficher les détails d'un journal d'erreurs XML à un utilisateur dans une application Winforms et je recherche le meilleur contrôle pour faire le travail.
Les données d'erreur contiennent toutes les variables du serveur au moment où l'erreur s'est produite.Ceux-ci ont été formatés dans un document XML qui ressemble à :
<error>
<serverVariables>
<item>
<value>
</item>
</serverVariables>
<queryString>
<item name="">
<value string="">
</item>
</queryString>
</error>
Je voudrais lire ces données à partir de la chaîne dans laquelle elles sont stockées et les afficher à l'utilisateur via un formulaire Windows de manière utile.Le Bloc-notes XML fait un bon travail de formatage XML, mais ce n'est pas vraiment ce que je recherche car je préférerais plutôt afficher les détails de l'élément dans un Nom :chaîne format.
Des suggestions ou est-ce que je recherche une implémentation personnalisée ?
[EDIT] Une section des données qui doit être affichée :
<?xml version="1.0" encoding="utf-8"?>
<error host="WIN12" type="System.Web.HttpException" message="The file '' does not exist." source="System.Web" detail="System.Web.HttpException: The file '' does not exist. at System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) at" time="2008-09-01T07:13:08.9171250+02:00" statusCode="404">
<serverVariables>
<item name="ALL_HTTP">
<value string="HTTP_CONNECTION:close HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) " />
</item>
<item name="AUTH_TYPE">
<value string="" />
</item>
<item name="HTTPS">
<value string="off" />
</item>
<item name="HTTPS_KEYSIZE">
<value string="" />
</item>
<item name="HTTP_USER_AGENT">
<value string="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" />
</item>
</serverVariables>
<queryString>
<item name="tid">
<value string="196" />
</item>
</queryString>
</error>
La solution
Vous pouvez transformer vos données XML en utilisant XSLT
Une autre option consiste à utiliser XLinq.
Si vous voulez un exemple de code concret, fournissez-nous des exemples de données
MODIFIER:voici un exemple de transformation XSLT pour votre fichier XML :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="//error/serverVariables">
<xsl:text>Server variables:
</xsl:text>
<xsl:for-each select="item">
<xsl:value-of select="@name"/>:<xsl:value-of select="value/@string"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="//error/queryString">
<xsl:text>Query string items:
</xsl:text>
<xsl:for-each select="item">
<xsl:value-of select="@name"/>:<xsl:value-of select="value/@string"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Vous pouvez appliquer cette transformation en utilisant XslCompiledTransform classe.Cela devrait donner un résultat comme ceci :
Variables du serveur :
ALL_HTTP:HTTP_CONNECTION:close HTTP_USER_AGENT:Mozilla/4.0 (compatible MSIE 6.0 ;Windows NT 5.1 ;SV1)
AUTH_TYPE :
HTTPS : désactivé
HTTPS_KEYSIZE :
HTTP_USER_AGENT :Mozilla/4.0 (compatible ;MSIE 6.0 ;Windows NT 5.1;S )Éléments de chaîne de requête :
marée:196
Autres conseils
Vous pouvez utiliser un contrôle arborescent et utiliser un algorithme XLinq récursif pour y placer les données.Je l'ai fait moi-même avec une interface permettant à un utilisateur de créer une représentation XML personnalisée et cela a très bien fonctionné.
Voir Liaison de données XML.Utilisez Visual Studio ou xsd.exe pour générer DataSet ou des classes à partir de XSD, puis utilisez System.Xml.Serialization.XmlSerializer
si nécessaire pour transformer votre XML en objets/DataSet.Massez les objets.Affichez-les dans une grille.
Vous pouvez essayer d'utiliser le DataGridView
contrôle.Pour voir un exemple, chargez un fichier XML dans DevStudio, puis cliquez avec le bouton droit sur le XML et sélectionnez « Afficher la grille de données ».Vous devrez lire la documentation de l'API sur le contrôle pour l'utiliser.