2009-10-03 50 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> 

我正在使用xml消息传递系统,其中消息数据包从队列中读取,并针对具有模式的规则应用。如果模式匹配,则会触发该规则并读取并存储xml的某些元素,节点等。使用Xpath表达式定义从消息中读取的内容。例如,以下xpath采用严重性属性并将其存储。如何确定正确的xml写出

name.set(“.// idmef:Classification/idmef:Assesment/idmef:Impact/@ severity”,“high”);

所以,我会采取该xpath,编译它,并阅读服务器属性和存储供后期使用。

当我使用存储值创建新的XML消息时,可能会出现这样一种情况,即completion和type属性是必需的。

所以问题是,如何检查是否需要写出这些属性。我知道模式涉及某种方式,但你怎么做。更重要的是,如果用户只选择严重性属性,那么我将如何去处理,在其他结构中添加分类,消息和其他元素时,如果有其他xpath查找,例如在

鲍勃。

+0

此XML格式不正确。你错过了一些吗? – 2009-10-03 16:56:45

+0

是的,我错过了一点点。 B – 2009-10-03 16:58:18

+0

任何想法如何做约翰? – 2009-10-03 17:00:14

回答

0

评论者是正确的 - 您需要先修复您的XML以使其良好形成。

但是,如果我正确理解您的问题,则需要写出一些XML,添加或更改某些属性。

如果这是你所需要的,我会尝试使用XSL转换来添加属性。 以下是身份转换的修改版本,应该接近您的需要。 如果你需要一些条件逻辑,然后围绕该属性的标签以xsl:如果

<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

Hi Nont, 表示不同的xml。我将这个问题编辑为真正的XML,而不是这个例子。那么这是如何工作的。我以前没有做过xslt。 – 2009-10-06 19:34:13

+0

我可以看到它是如何工作的,作为您的选择节点,然后匹配属性,但如果用户给了我xpath字符串以将portlist设置为5,它将如何工作,如下所示。 5 我该如何去构建它周围的节点,并且包含任何必须的xml节点,空白或缺省值,因为用户没有提供它们。 我觉得你很接近,但我需要看看它是如何工作在xml包的不同部分。 – 2009-10-06 19:42:37

+0

XSLT用于转换XML。这个想法是,你拿一块XML,然后把它转换成另一块。我从你那里得到的印象是你的输出文档看起来很像你的输入文档。如果是这种情况,那么XSL将是一个不错的选择。如果它非常不同,而我错了,那么它不是一个好选择。我使用撒克逊进行转换。我给出的例子只修改了Impact节点,并保持原样。对于一般的XSL教程,尝试http://www.w3schools.com/xsl/ – nont 2009-10-06 19:55:46

0

,你可以:

  • 打开原始XML(A)
  • 创建一个新的XML文档(B)
  • 运行你对(A)的XPath
  • 添加匹配结果(B)
  • 保存(B)

这有什么意义?

+0

确定它需要完成的方式,但是对于第四个和第五个操作它是如何完成的。当你针对A运行xpath时,你如何将一块A应用到B中。 – 2009-10-09 17:52:13

0

我在这里找到了一个答案在stackoverflow,这里是。 Create XML Nodes from XPath我知道它离我上面描述的距离还很遥远,但在我设计它的时候,我没有一个scobie如何工作。

+0

什么是scobie? – nont 2009-10-15 19:17:09

+0

伦敦押韵俚语。 – 2010-01-19 13:30:08