2009-10-03 10 views
1
<?xml version="1.0" encoding="UTF-8"?> 
<idmef:IDMEF-Message version="1.0" xmlns:idmef="http://iana.org/idmef"> 
<idmef:Alert messageid="abc123456789"> 
    <idmef:Analyzer analyzerid="bc-corr-01"> 
    <idmef:Node category="dns"> 
     <idmef:name>correlator01.example.com</idmef:name> 
    </idmef:Node> 
    </idmef:Analyzer> 
     <idmef:CreateTime ntpstamp="0xbc72423b.0x00000000">2000-03-09T15:31:07Z 
    </idmef:CreateTime> 
    <idmef:Source ident="a1"> 
    <idmef:Node ident="a1-1"> 
     <idmef:Address ident="a1-2" category="ipv4-addr"> 
     <idmef:address>192.0.2.200</idmef:address> 
     </idmef:Address> 
    </idmef:Node> 
    </idmef:Source> 
    <idmef:Target ident="a2"> 
    <idmef:Node ident="a2-1" category="dns"> 
     <idmef:name>www.example.com</idmef:name> 
     <idmef:Address ident="a2-2" category="ipv4-addr"> 
     <idmef:address>192.0.2.50</idmef:address> 
     </idmef:Address> 
    </idmef:Node> 
    <idmef:Service ident="a2-3"> 
     <idmef:portlist>5 
     </idmef:portlist> 
    </idmef:Service> 
    </idmef:Target> 
    <idmef:Classification text="Login Authentication"> 
    <idmef:Reference origin="vendor-specific"> 
     <idmef:name>portscan</idmef:name> 
     <idmef:url>http://www.vendor.com/portscan</idmef:url> 
    </idmef:Reference> 
    </idmef:Classification> 
<idmef:Assessment> 
    <idmef:Impact severity ="high" completion ="failed" type ="file" > 
    </idmef:Impact> 
</idmef:Assessment> 
</idmef:Alert> 
</idmef:IDMEF-Message> 

Je travaille avec un système de messagerie XML, où un paquet de message est lu à partir d'une file d'attente, et appliqué à une règle avec un motif. Si le motif correspond, la règle se déclenche et certains éléments, noeud, etc. du fichier XML sont lus et stockés. La définition de ce qui doit être lu dans le message est définie à l'aide de l'expression Xpath. Par exemple, le chemin x suivant prend l'attribut severity et le stocke. Nom.set (".// idmef: Classification/idmef: Assesment/idmef: Impact/@ severity", "high"); Donc, je voudrais prendre ce xpath, le compiler, et lire l'attribut serverity et le stocker pour la dernière utilisation.Comment déterminer le bon xml à écrire

Lorsque je vais créer le nouveau message XML à l'aide de la valeur stockée, il se peut que l'attribut completion et type soit obligatoire.

Donc, la question est, comment puis-je vérifier si ces attributs doivent être écrits. Je sais que ce schéma est impliqué d'une manière ou d'une autre, mais comment le faites-vous? Plus précisément, si l'utilisateur ne sélectionne que l'attribut severity, comment procéder, en ajoutant dans le reste de la structure, comme Classification, Message et autres éléments, lorsque des recherches xpath supplémentaires, par exemple à

Bob.

+0

Ce code XML n'est pas bien formé. En manquez-vous? –

+0

Oui, il me manque un petit peu. B –

+0

Une idée de comment le faire John? –

Répondre

0

Les commentateurs sont corrects - vous devez d'abord corriger votre code XML pour le rendre bien formé. Toutefois, si je comprends bien votre problème, vous devez écrire du code XML, en ajoutant ou en modifiant certains attributs.

Si c'est ce dont vous avez besoin j'essaierais d'utiliser une transformation XSL pour ajouter les attributs. Voici une version modifiée de la transformation d'identité qui devrait être proche de ce dont vous avez besoin. si vous avez besoin d'une logique conditionnelle alors entourent les balises d'attribut avec xsl: if

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:idmef="http://iana.org/idmef" xpath-default-namespace="http://iana.org/idmef"> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

     <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="Impact"> 
      <xsl:copy> 
       <xsl:copy-of select="@*"/> 
       <xsl:attribute name="severity">high</xsl:attribute> 
       <xsl:attribute name="completion">failed</xsl:attribute> 
       <xsl:attribute name="type">file</xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:copy> 
     </xsl:template> 
    </xsl:stylesheet> 
+0

Salut Nont, Ce différent xml. J'ai édité la question pour mettre en vrai xml, par opposition à l'exemple. Alors, comment ça marche? Je n'ai pas fait de xslt auparavant. –

+0

Je peux voir comment cela fonctionne, en tant que votre noeud de sélection, et puis correspondant sur les attributs, mais comment cela fonctionnerait, si un utilisateur m'a donné la chaîne xpath pour définir portlist à 5 comme ci-dessous. Comment devrais-je construire les noeuds autour d'elle et inclure tous les noeuds xml obligatoires avec, dans les champs d'attribut évidemment être vide ou des valeurs par défaut, car l'utilisateur ne les a pas fournies. Je pense que vous êtes assez proche, mais j'ai besoin de voir comment cela fonctionne sur différentes parties du paquet xml. –

+0

XSLT est fait pour transformer XML. L'idée est de prendre un morceau de XML et de le transformer en un autre. J'ai l'impression de votre question que votre document de sortie ressemble beaucoup à votre document d'entrée. Si c'est le cas, alors XSL serait un bon choix. Si c'est très différent, et je me trompe, ce n'est pas un bon choix. J'utilise Saxon pour exécuter la transformation. L'exemple que j'ai donné modifie seulement le nœud Impact, et laisse le reste tel quel. Pour un tutoriel XSL général, essayez http://www.w3schools.com/xsl/ – nont

0

Vous pouvez:

  • Open XML d'origine (A)
  • Créez un nouveau document XML (B)
  • Exécutez votre XPath contre (A)
  • Ajouter correspondant à des résultats (B)
  • Save (B)

Cela a-t-il un sens?

+0

Bien sûr que la façon dont il doit être fait, mais comment est-ce fait pour les 4ème et 5ème actions. Lorsque vous exécutez le xpath contre A, comment appliquez-vous un morceau de A dans B. –

0

J'ai trouvé une réponse ici sur stackoverflow, et la voici. Create XML Nodes from XPath Je sais que c'est aussi loin de la façon dont je l'ai décrit ci-dessus, mais au moment où je le conçois, je n'avais pas de scobie comment cela fonctionnerait.

+0

qu'est-ce qu'un scobie? – nont

+0

Cockney rimant argot. –

Questions connexes