下面是前段时间写的一些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
你可以先用open 来创建这个XML文件呀,然后里面写一个根结点(比如<root>),然后再自己写一个添加子结点的函数,比如:dim a as IXMLDOMNode ... a.appendchild node 然后再调用SetXMLNode设置它的属性就可以了
sinom(毛毛.小狮子.小白MOU) 根据你给我的第三个函数,得到解果..结合我给的那个格式说: <file id="批量转帐"> <row id = "111" name = "dkfj"/> </file> 用你给我的函数需要先把XML的模板定义好.也就是说在写文件的时候必须要有一个XML,而且里全要包括全部的节点.格式如下: <file id> <row id name /> </file> 对吗? 但现在有一个问题.我是没办法去手工设置这个模板的,因为row的值是动态的,也就是说会有多个row,所以要设置这个模板也只有程序来写这个模板.但写模板的时候就有一个问题了. 我要设置id这个属性名怎么设置呢????
对了,像你这样的操作可以直接用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 的方法
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)
'* 名称 :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
这句话出错呀.
这个文件的所有节点都是我在写的时候加上去的.所以不用加载一个已经具有格式的文件呀.
...
a.appendchild node
然后再调用SetXMLNode设置它的属性就可以了
根据你给我的第三个函数,得到解果..结合我给的那个格式说:
<file id="批量转帐">
<row id = "111" name = "dkfj"/>
</file>
用你给我的函数需要先把XML的模板定义好.也就是说在写文件的时候必须要有一个XML,而且里全要包括全部的节点.格式如下:
<file id>
<row id name />
</file>
对吗?
但现在有一个问题.我是没办法去手工设置这个模板的,因为row的值是动态的,也就是说会有多个row,所以要设置这个模板也只有程序来写这个模板.但写模板的时候就有一个问题了. 我要设置id这个属性名怎么设置呢????
<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
的方法
问题已解决.解决方法是先创建模板,在导入值
..但还有一个问题..我生成的XML文件需要是unicode编译的文件.但我生成的是UTF-8编译的文件.请问有什么方法能生成unicode的文件.但不能在XML文件里加下面这句来设置编译
<?xml version"1.0" encoding ="GB2312"?>"
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文件里
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)