我用MSXML4.0写一个XML文件.但要求节点据有attributes
格式如下:
<file id="批量转帐">
     <row id = "111" name = "dkfj"/>
</file>那位大哥知道,请帮帮小弟..

解决方案 »

  1.   

    下面是前段时间写的一些XML处理函数,看看是否有用?'******************************************************************
    '*  名称    :GetXMLNode
    '*
    '*  说明    :从XML配置文件中得到某节点的属性值
    '*            并返回该Node对象。
    '*
    '*  输入    :strXMLFile(string)  XML文件名
    '*            strNodeName(string) 节点名称
    '*            strAttributeName(string) 指定的属性名称 可选(默认值="value")
    '*
    '*  输出    :strAttributeValue(string) 指定属性的值。如果输入"NULL"则只返回对象,不输入属性值。
    '*
    '*  返回    :IXMLDOMNode
    '*            IXMLDOMNode-成功
    '*            Nothing-失败
    '*
    '*  历史    :周晓宁创建于2004年07月02日
    '******************************************************************
    Public Function GetXMLNode(ByVal strXMLFile As String, ByVal strNodeName As String, ByRef strAttributeValue As Variant, Optional ByVal strAttributeName As String = "value") As IXMLDOMNodeDim objXMLDoc As DOMDocument, objNode As IXMLDOMNode    'on error GoTo ErrHandler
            
        Set objXMLDoc = New DOMDocument
        With objXMLDoc
        
            '加载XML文件
            .Load strXMLFile
            
            Set objNode = objXMLDoc.selectSingleNode(strNodeName)
            '判断是否输出属性值
            If UCase(strAttributeValue) <> "NULL" Then _
                strAttributeValue = objNode.Attributes.getNamedItem(strAttributeName).nodeValue
            
            Set GetXMLNode = objNode
            
        End With
        
        Set objNode = Nothing
        Set objXMLDoc = Nothing
        
        Exit Function
    ErrHandler:    '记录错误信息
        typErrInfo.strErrMsg = Err.Description: typErrInfo.strErrNo = Err.Number
        '写入错误日志
        'WriteLog 3, typErrInfo.strErrMsg, typErrInfo.strErrNo
        
        Set objNode = Nothing
        Set objXMLDoc = Nothing
        
    End Function'******************************************************************
    '*  名称    :GetXMLNodeList
    '*
    '*  说明    :从XML配置文件中得到某节点的属性值
    '*            并返回该Node对象。
    '*
    '*  输入    :strXMLFile(string)  XML文件名
    '*            strNodeName(string) 节点名称
    '*
    '*  输出    :
    '*
    '*  返回    :IXMLDOMNodeList
    '*            IXMLDOMNodeList-成功
    '*            Nothing-失败
    '*
    '*  历史    :周晓宁创建于2004年07月02日
    '******************************************************************
    Public Function GetXMLNodeList(ByVal strXMLFile As String, ByVal strNodeName As String) As IXMLDOMNodeListDim objXMLDoc As DOMDocument, objNodeList As IXMLDOMNodeList    'on error GoTo ErrHandler
            
        Set objXMLDoc = New DOMDocument
        With objXMLDoc
        
            '加载XML文件
            .Load strXMLFile
            
            Set objNodeList = objXMLDoc.selectNodes(strNodeName)
            
            Set GetXMLNodeList = objNodeList
            
        End With
        
        Set objNodeList = Nothing
        Set objXMLDoc = Nothing
        
        Exit Function
    ErrHandler:    '记录错误信息
        typErrInfo.strErrMsg = Err.Description: typErrInfo.strErrNo = Err.Number
        '写入错误日志
        'WriteLog 3, typErrInfo.strErrMsg, typErrInfo.strErrNo
        
        Set objNodeList = Nothing
        Set objXMLDoc = Nothing
        
    End Function'******************************************************************
    '*  名称    :SetXMLNode
    '*
    '*  说明    :设置指定节点的属性值。默认为设置该节点"value"属性的值。
    '*
    '*  输入    :strXMLFile(string) XML文件名
    '*            strNodeName(string) 节点名称
    '*            strAttributeValue(string) 节点属性的设置值
    '*            strAttributeName(string) 指定的属性名称 可选(默认值="value")
    '*
    '*  输出    :
    '*
    '*  返回    :long
    '*            1-成功
    '*            0-失败
    '*
    '*  历史    :周晓宁创建于2004年07月02日
    '******************************************************************
    Public Function SetXMLNode(ByVal strXMLFile As String, ByVal strNodeName As String, ByVal strAttributeValue As String, Optional ByVal strAttributeName As String = "value") As Long
        
    Dim objXMLDoc As DOMDocument, objNode As IXMLDOMNode
        
        'on error GoTo ErrHandler
        
        Set objXMLDoc = New DOMDocument
        With objXMLDoc
        
            '加载XML文件
            .Load strXMLFile
            
            Set objNode = objXMLDoc.selectSingleNode(strNodeName)
            objNode.Attributes.getNamedItem(strAttributeName).nodeValue = strAttributeValue
            
            objXMLDoc.Save strXMLFile
            
            SetXMLNode = 1
            
        End With
        
        Set objNode = Nothing
        Set objXMLDoc = Nothing
        
        Exit Function
    ErrHandler:    '记录错误信息
        typErrInfo.strErrMsg = Err.Description: typErrInfo.strErrNo = Err.Number
        '写入错误日志
        'WriteLog 3, typErrInfo.strErrMsg, typErrInfo.strErrNo
        
        SetXMLNode = 0
        
        Set objNode = Nothing
        Set objXMLDoc = Nothing
        
    End Function
      

  2.   

    大哥..我要的就是SetXMLNode函数.但我运行objNode.Attributes.getNamedItem(strAttributeName).nodeValue = strAttributeValue
    这句话出错呀.
      

  3.   

    我是要写一个XML文件...
    这个文件的所有节点都是我在写的时候加上去的.所以不用加载一个已经具有格式的文件呀.
      

  4.   

    你可以先用open 来创建这个XML文件呀,然后里面写一个根结点(比如<root>),然后再自己写一个添加子结点的函数,比如:dim a as IXMLDOMNode
    ...
    a.appendchild node
    然后再调用SetXMLNode设置它的属性就可以了
      

  5.   

    sinom(毛毛.小狮子.小白MOU) 
    根据你给我的第三个函数,得到解果..结合我给的那个格式说:
    <file id="批量转帐">
         <row id = "111" name = "dkfj"/>
    </file>
    用你给我的函数需要先把XML的模板定义好.也就是说在写文件的时候必须要有一个XML,而且里全要包括全部的节点.格式如下:
    <file id>
         <row id name />
    </file>
    对吗?
    但现在有一个问题.我是没办法去手工设置这个模板的,因为row的值是动态的,也就是说会有多个row,所以要设置这个模板也只有程序来写这个模板.但写模板的时候就有一个问题了. 我要设置id这个属性名怎么设置呢????
      

  6.   

    对了,像你这样的操作可以直接用ADO来完成呀,比如:
    <files>  --------你可以把files结点看成一张表来打开
     <file id="123">  ----------------而把file结点做为一条记录
     </file>
     <file id="456">  ----------------这是第二条记录
     </file>
    </files>先用connection对象连接xml文件,然后用commad插入一个结点(记录)
    dim con as adodb.connection
    dim comm as adodb.command
    ...
    comm.commandtext="insert into files (id,...) values (...)"
    comm.execute
    ...
    不过这样做的缺点就是id就不是file结点的属性了,而变成了file结点的一个子结点...所以如果要创建属性还有要用:
    dim a as IXMLDOMNode
    ...
    a.appendchild node
    的方法
      

  7.   

    sinom(毛毛.小狮子.小白MOU)
    问题已解决.解决方法是先创建模板,在导入值
    ..但还有一个问题..我生成的XML文件需要是unicode编译的文件.但我生成的是UTF-8编译的文件.请问有什么方法能生成unicode的文件.但不能在XML文件里加下面这句来设置编译
    <?xml version"1.0" encoding ="GB2312"?>"
      

  8.   

    看看MSDN里对函数的说明吧:
    StrConv 函数
          返回按指定类型转换的 Variant (String)。语法StrConv(string, conversion, LCID)StrConv 函数的语法有下面的命名参数:部分 说明 
    string 必要参数。要转换的字符串表达式。 
    conversion 必要参数。Integer。其值的和决定转换的类型。 
    LCID 可选的。如果与系统LocaleID不同,则为LocaleID(系统LocaleID为缺省值。) 
    设置值conversion 参数的设置值为:常数 值 说明 
    vbUpperCase 1 将字符串文字转成大写。 
    vbLowerCase 2 将字符串文字转成小写。 
    vbProperCase 3 将字符串中每个字的开头字母转成大写。 
    vbWide* 4* 将字符串中单字节字符转成双字节字符。 
    vbNarrow* 8* 将字符串中双字节字符转成单字节字符。 
    vbKatakana** 16** 将字符串中平假名字符转成片假名字符。 vbHiragana** 32** 将字符串中片假名字符转成平假名字符。 
    vbUnicode 64 根据系统的缺省码页将字符串转成 Unicode。 
    vbFromUnicode 128 将字符串由 Unicode 转成系统的缺省码页。 *应用到远东国别。**仅应用到日本。注意 这些常数是由 VBA 指定的。可以在程序中使用它们来替换真正的值。其中大部分是可以组合的,例如 vbUpperCase + vbWide,互斥的常数不能组合,例如 vbUnicode + vbFromUnicode。当在不适用的国别使用常数 vbWide、vbNarrow、vbKatakana,和 vbHiragana 时,就会导致运行时错误。下面是一些一般情况下的有效分界符:Null (Chr$(0)),水平制表符 (Chr$(9)),换行 (Chr$(10)),垂直制表符 (Chr$(11)),换页 (Chr$(12)) ,回车 (Chr$(13)),空白 (SBCS) (Chr$(32))。在 DBCS中,空白的实际值会随国家/地区而不同。说明在把 ANSI 格式的 Byte 数组转换为字符串时,您应该使用 StrConv 函数。当您转换 Unicode 格式的这种数组时,使用赋值语句。你可以用open 读文件到string里,然后用strconv函数转换后再写到XML文件里
      

  9.   

    这种方法我早就试了.不行.如果字符串太长,就变成全角的了.这样XML就不认了.郁闷 死了.大哥还有什么别的处理方法吗??
      

  10.   

    Dim doc As DOMDocument
    Dim insturct As MSXML2.IXMLDOMProcessingInstruction
       
        Set doc = New DOMDocument    
        Set insturct = doc.createProcessingInstruction("xml", "version='1.0' encoding='gb2312'")
        doc.insertBefore insturct, doc.childNodes.Item(0)