mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.9 KiB
222 lines
5.9 KiB
Attribute VB_Name = "XML"
|
|
Option Explicit
|
|
|
|
Public Function XMLFindFirstNode( _
|
|
ByVal i_DOMNode As MSXML2.IXMLDOMNode, _
|
|
ByVal i_strName As String _
|
|
) As MSXML2.IXMLDOMNode
|
|
|
|
Dim DOMNode As MSXML2.IXMLDOMNode
|
|
|
|
Set XMLFindFirstNode = Nothing
|
|
|
|
If (i_DOMNode.nodeName = i_strName) Then
|
|
|
|
Set XMLFindFirstNode = i_DOMNode
|
|
Exit Function
|
|
|
|
ElseIf (Not (i_DOMNode.firstChild Is Nothing)) Then
|
|
|
|
For Each DOMNode In i_DOMNode.childNodes
|
|
|
|
Set XMLFindFirstNode = XMLFindFirstNode(DOMNode, i_strName)
|
|
|
|
If (Not (XMLFindFirstNode Is Nothing)) Then
|
|
Exit Function
|
|
End If
|
|
|
|
Next
|
|
|
|
End If
|
|
|
|
End Function
|
|
|
|
Public Function XMLGetAttribute( _
|
|
ByVal i_DOMNode As MSXML2.IXMLDOMNode, _
|
|
ByVal i_strAttributeName As String _
|
|
) As String
|
|
|
|
On Error Resume Next
|
|
|
|
XMLGetAttribute = i_DOMNode.Attributes.getNamedItem(i_strAttributeName).nodeValue
|
|
|
|
End Function
|
|
|
|
Public Sub XMLSetAttribute( _
|
|
ByVal u_DOMNode As MSXML2.IXMLDOMNode, _
|
|
ByVal i_strAttributeName As String, _
|
|
ByVal i_strAttributeValue As String _
|
|
)
|
|
Dim Element As MSXML2.IXMLDOMElement
|
|
|
|
Set Element = u_DOMNode
|
|
|
|
Element.setAttribute i_strAttributeName, i_strAttributeValue
|
|
|
|
End Sub
|
|
|
|
Public Function XMLCreateChildElement( _
|
|
ByVal u_DOMNodeParent As MSXML2.IXMLDOMNode, _
|
|
ByVal i_strElementName As String, _
|
|
ByVal i_blnNameValuePairsExist As Boolean, _
|
|
ByRef i_arrNameValuePairs() As String _
|
|
) As MSXML2.IXMLDOMNode
|
|
|
|
Dim DOMDoc As MSXML2.DOMDocument
|
|
Dim Element As MSXML2.IXMLDOMElement
|
|
Dim intIndex As Long
|
|
|
|
Set DOMDoc = u_DOMNodeParent.ownerDocument
|
|
|
|
Set Element = DOMDoc.createElement(i_strElementName)
|
|
Set XMLCreateChildElement = u_DOMNodeParent.appendChild(Element)
|
|
|
|
If (i_blnNameValuePairsExist) Then
|
|
For intIndex = LBound(i_arrNameValuePairs) To UBound(i_arrNameValuePairs)
|
|
Element.setAttribute i_arrNameValuePairs(intIndex, 0), _
|
|
i_arrNameValuePairs(intIndex, 1)
|
|
Next
|
|
End If
|
|
|
|
End Function
|
|
|
|
Public Sub XMLCopyAttributes( _
|
|
ByRef i_DOMNodeSrc As MSXML2.IXMLDOMNode, _
|
|
ByRef u_DOMNodeDest As MSXML2.IXMLDOMNode _
|
|
)
|
|
|
|
Dim Attr As MSXML2.IXMLDOMAttribute
|
|
Dim Element As MSXML2.IXMLDOMElement
|
|
|
|
Set Element = u_DOMNodeDest
|
|
|
|
For Each Attr In i_DOMNodeSrc.Attributes
|
|
Element.setAttribute Attr.Name, Attr.Value
|
|
Next
|
|
|
|
End Sub
|
|
|
|
Public Function XMLCopyDOMTree( _
|
|
ByRef i_DOMNodeSrc As MSXML2.IXMLDOMNode, _
|
|
ByRef u_DOMNodeParent As MSXML2.IXMLDOMNode _
|
|
) As MSXML2.IXMLDOMNode
|
|
|
|
Dim DOMNode As MSXML2.IXMLDOMNode
|
|
Dim DOMElement As MSXML2.IXMLDOMElement
|
|
Dim DOMText As MSXML2.IXMLDOMText
|
|
Dim DOMAttr As MSXML2.IXMLDOMAttribute
|
|
Dim DOMNodeChild As MSXML2.IXMLDOMNode
|
|
|
|
If (i_DOMNodeSrc.ownerDocument Is u_DOMNodeParent.ownerDocument) Then
|
|
Set DOMNode = i_DOMNodeSrc.cloneNode(True)
|
|
u_DOMNodeParent.appendChild DOMNode
|
|
Else
|
|
' Different DOM Nodes, so we really have to copy and
|
|
' recreate the node from one DOM Tree to another.
|
|
Select Case i_DOMNodeSrc.nodeType
|
|
Case NODE_TEXT
|
|
Set DOMText = u_DOMNodeParent.ownerDocument.createTextNode(i_DOMNodeSrc.Text)
|
|
Set DOMNode = u_DOMNodeParent.appendChild(DOMText)
|
|
Case Else
|
|
Set DOMElement = u_DOMNodeParent.ownerDocument.createElement(i_DOMNodeSrc.nodeName)
|
|
Set DOMNode = u_DOMNodeParent.appendChild(DOMElement)
|
|
|
|
For Each DOMAttr In i_DOMNodeSrc.Attributes
|
|
DOMElement.setAttribute DOMAttr.nodeName, DOMAttr.nodeValue
|
|
Next
|
|
|
|
For Each DOMNodeChild In i_DOMNodeSrc.childNodes
|
|
XMLCopyDOMTree DOMNodeChild, DOMNode
|
|
Next
|
|
End Select
|
|
End If
|
|
|
|
Set XMLCopyDOMTree = DOMNode
|
|
|
|
End Function
|
|
|
|
Private Function p_XMLValidChar( _
|
|
ByRef i_char As String _
|
|
) As Boolean
|
|
|
|
Dim intAscW As Long
|
|
|
|
intAscW = AscW(i_char)
|
|
|
|
' Sometimes AscW returns a negative number. Eg 0x8021 -> 0xFFFF8021
|
|
intAscW = intAscW And &HFFFF&
|
|
|
|
Select Case intAscW
|
|
Case &H9&, &HA&, &HD&, &H20& To &HD7FF&, &HE000& To &HFFFD&
|
|
p_XMLValidChar = True
|
|
Case Else
|
|
p_XMLValidChar = False
|
|
End Select
|
|
|
|
End Function
|
|
|
|
Public Function XMLValidString( _
|
|
ByRef i_str As String _
|
|
) As Boolean
|
|
|
|
Dim intIndex As Long
|
|
Dim intLength As Long
|
|
|
|
intLength = Len(i_str)
|
|
|
|
For intIndex = 1 To intLength
|
|
If (Not p_XMLValidChar(Mid$(i_str, intIndex, 1))) Then
|
|
XMLValidString = False
|
|
Exit Function
|
|
End If
|
|
Next
|
|
|
|
XMLValidString = True
|
|
|
|
End Function
|
|
|
|
Public Function XMLMakeValidString( _
|
|
ByRef i_str As String _
|
|
) As String
|
|
|
|
Dim intIndex As Long
|
|
Dim intLength As Long
|
|
Dim str As String
|
|
|
|
XMLMakeValidString = i_str
|
|
intLength = Len(i_str)
|
|
|
|
For intIndex = 1 To intLength
|
|
If (Not p_XMLValidChar(Mid$(i_str, intIndex, 1))) Then
|
|
XMLMakeValidString = Mid$(XMLMakeValidString, 1, intIndex - 1) & " " & _
|
|
Mid$(XMLMakeValidString, intIndex + 1)
|
|
End If
|
|
Next
|
|
|
|
End Function
|
|
|
|
Public Function XMLEscape( _
|
|
ByVal i_str As String _
|
|
) As String
|
|
|
|
XMLEscape = XMLMakeValidString(i_str)
|
|
XMLEscape = Replace$(XMLEscape, "&", "&")
|
|
XMLEscape = Replace$(XMLEscape, "<", "<")
|
|
XMLEscape = Replace$(XMLEscape, ">", ">")
|
|
XMLEscape = Replace$(XMLEscape, "'", "'")
|
|
XMLEscape = Replace$(XMLEscape, """", """)
|
|
|
|
End Function
|
|
|
|
Public Function XMLUnEscape( _
|
|
ByVal i_str As String _
|
|
) As String
|
|
|
|
XMLUnEscape = i_str
|
|
XMLUnEscape = Replace$(XMLUnEscape, """, """")
|
|
XMLUnEscape = Replace$(XMLUnEscape, "'", "'")
|
|
XMLUnEscape = Replace$(XMLUnEscape, ">", ">")
|
|
XMLUnEscape = Replace$(XMLUnEscape, "<", "<")
|
|
XMLUnEscape = Replace$(XMLUnEscape, "&", "&")
|
|
|
|
End Function
|