如何确定要写出的正确xml

时间:2009-10-03 16:39:12

标签: c# xml xpath

<?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采用severity属性并存储它。

name.set( “.// IDMEF:分类/ IDMEF:Assesment / IDMEF:影响/ @严重性”, “高”);

所以,我会接受该xpath,编译它,并读取serverity属性并存储以供后者使用。

当我使用存储的值创建新的XML消息时,可能存在completion和type属性是必需的。

所以问题是,如何检查是否需要写出这些属性。我知道架构是以某种方式涉及的,但你是如何做到的。更重要的是,如果用户只选择严重性属性,我将如何进行,添加结构的其余部分,如分类,消息和其他元素,如果有额外的xpath查找,例如在

鲍勃。

3 个答案:

答案 0 :(得分:0)

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

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

如果这是你需要的,我会尝试使用XSL转换来添加属性。 以下是身份变换的修改版本,应该接近您的需要。 如果你需要一些条件逻辑,那么用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>

答案 1 :(得分:0)

你可以:

  • 打开原始XML(A)
  • 创建新的XML文档(B)
  • 针对(A)
  • 运行xpath
  • 将匹配结果添加到(B)
  • 保存(B)

这有什么意义吗?

答案 2 :(得分:0)

我在stackoverflow上找到了答案,就在这里。 Create XML Nodes from XPath我知道它与我上面的描述相差甚远,但在我设计时,我 没有scobie它会如何工作。