Mihir1977
asked on
problem using MSXML.DomDocument cant create nodes
Hi friends!!
I use MSXML.DomDocument, when i use its procedure like createTextNode or other methods it doesnot create it and doesnot work. In short it doesn't create child nodes or base nodes. So, if any one knowing regarding this. Please help me.
Thanks in advance,
Mihir
I use MSXML.DomDocument, when i use its procedure like createTextNode or other methods it doesnot create it and doesnot work. In short it doesn't create child nodes or base nodes. So, if any one knowing regarding this. Please help me.
Thanks in advance,
Mihir
For example in VB you would do
Dim y As MSXML.IXMLDOMText
Dim x As MSXML.DOMDocument
Set x = New MSXML.DOMDocument
Set y = x.createTextNode("x")
So I wonder where you have create a new domdocument
Regards,
CJ
Dim y As MSXML.IXMLDOMText
Dim x As MSXML.DOMDocument
Set x = New MSXML.DOMDocument
Set y = x.createTextNode("x")
So I wonder where you have create a new domdocument
Regards,
CJ
here an example in C++ which creates a document and a root element on it:
IXMLDOMDocumentPtr spXMLDokument(__uuidof(DOM Document)) ;
//create a new Element, that will be the root!
IXMLDOMElementPtr spXMLNewElement = spXMLDokument->createEleme nt(bstrRoo tName);
//set the new element as root resp. documentElement
spXMLDokument->PutRefdocum entElement (spXMLNewE lement);
IXMLDOMDocumentPtr spXMLDokument(__uuidof(DOM
//create a new Element, that will be the root!
IXMLDOMElementPtr spXMLNewElement = spXMLDokument->createEleme
//set the new element as root resp. documentElement
spXMLDokument->PutRefdocum
Here is a class module I use to manipulate XML (VB Example)
Option Explicit
'Private XML holders
Private m_ActiveNode As IXMLDOMNode
Const UserLNK As String = "Markup.xml"
Const UserFile As String = "User.xib"
'Private Data Members
Private m_BOF As Boolean
Private m_EOF As Boolean
Private m_ImgID As String
Private m_Line As Long
Private m_Offset As Long
Private m_Length As Long
Private m_Address As String
Private m_Filename As String
Private m_isModified As Boolean
Private m_Error As Long
Private m_szError As String
Private m_UserLnkFile As String
'Private Constants
Const SUCCESS As Boolean = True
Const FAIL As Boolean = Not SUCCESS
Public Property Get isModified() As Boolean
isModified = m_isModified
End Property
Public Property Let ImgID(ByVal newVal As String)
m_ImgID = newVal
End Property
Public Property Get ImgID() As String
ImgID = m_ActiveNode.Attributes.ge tNamedItem ("ImgID"). Text
End Property
Public Property Let Offset(ByVal newVal As Long)
m_Offset = newVal
End Property
Public Property Get Offset() As Long
If (m_ActiveNode.Attributes.g etNamedIte m("Offset" ).Text) = "" Then
Offset = 0
Else
Offset = CLng(m_ActiveNode.Attribut es.getName dItem("Off set").Text )
End If
End Property
Public Property Let Length(ByVal newVal As Long)
m_Length = newVal
End Property
Public Property Get Length() As Long
If (m_ActiveNode.Attributes.g etNamedIte m("Length" ).Text) = "" Then
Length = 0
Else
Length = CLng(m_ActiveNode.Attribut es.getName dItem("Len gth").Text )
End If
End Property
Public Property Let Line(ByVal newVal As Long)
m_Line = newVal
End Property
Public Property Get Line() As Long
If (m_ActiveNode.Attributes.g etNamedIte m("Line"). Text) = "" Then
Line = 0
Else
Line = CLng(m_ActiveNode.Attribut es.getName dItem("Lin e").Text)
End If
End Property
Public Property Let Address(ByVal newVal As String)
m_Address = newVal
End Property
Public Property Get Address() As String
Address = m_ActiveNode.Attributes.ge tNamedItem ("Address" ).Text
End Property
Private Property Let EOF(ByVal newVal As Boolean)
m_EOF = newVal
End Property
Public Property Get EOF() As Boolean
EOF = m_EOF
End Property
Private Property Let BOF(ByVal newVal As Boolean)
m_BOF = newVal
End Property
Public Property Get BOF() As Boolean
BOF = m_BOF
End Property
Public Property Get FullPath() As String
FullPath = GetTempPath() + UserFile
End Property
Public Property Get fileName() As String
fileName = m_Filename
End Property
Public Property Get Error() As Long
Error = m_Error
End Property
Public Property Get ErrorDesc() As String
ErrorDesc = m_szError
End Property
Public Sub MoveFirst()
Set m_ActiveNode = m_XML_DOM.selectSingleNode ("Markup/H yperLinks/ Link")
If Not m_ActiveNode Is Nothing Then
m_BOF = True
m_EOF = False
Else
m_EOF = True
End If
End Sub
Public Sub MoveLast()
If Not m_ActiveNode.lastChild Is Nothing Then
Set m_ActiveNode = m_ActiveNode.lastChild
End If
m_EOF = True
m_BOF = False
End Sub
Public Sub MoveNext()
If Not m_ActiveNode.nextSibling Is Nothing Then
Set m_ActiveNode = m_ActiveNode.nextSibling
Else
m_EOF = True
End If
End Sub
Public Sub MovePrev()
If Not m_ActiveNode.previousSibli ng Is Nothing Then
Set m_ActiveNode = m_ActiveNode.previousSibli ng
Else
m_BOF = True
End If
End Sub
Private Function SearchItem(nLine As Long, nOffset As Long) As IXMLDOMNode
Set SearchItem = m_XML_DOM.selectSingleNode ("Markup/H yperLinks/ Link[@Line $eq$ " & nLine & "][@Offset
$eq$ " & nOffset & "]")
End Function
Public Function SetItem(nLineNo As Long, nOffset As Long) As Boolean
SetItem = FAIL
Set m_ActiveNode = m_XML_DOM.selectSingleNode ("Markup/H yperLinks/ Link[@Line $eq$ " & nLineNo & "][@Offset
$eq$ " & nOffset & "]")
If Not m_ActiveNode Is Nothing Then SetItem = SUCCESS
End Function
Public Function AddItem() As Boolean
On Error GoTo EH
AddItem = FAIL
Dim oRoot As IXMLDOMNode
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
Dim oAttrib As IXMLDOMAttribute
If m_XML_DOM Is Nothing Then
Set m_XML_DOM = New DOMDocument
'
' New Document, add headings
'
Set oNode = m_XML_DOM.createProcessing Instructio n("xml", "version='1.0'")
Set oNode = m_XML_DOM.insertBefore(oNo de, m_XML_DOM.childNodes.Item( 0))
'
' Create document roots
'
Set oRoot = m_XML_DOM.createElement("M arkup")
Set m_XML_DOM.documentElement = oRoot
Set oChild = m_XML_DOM.createElement("H yperLinks" )
oRoot.appendChild oChild
End If
Set oRoot = m_XML_DOM.selectSingleNode ("Markup")
Set oChild = oRoot.selectSingleNode("Hy perLinks")
'
' Set the root document element to be appended to.
'
Set oRoot = m_XML_DOM.selectSingleNode ("Markup/H yperLinks" )
'
' add item
'
Set oNode = m_XML_DOM.createElement("L ink")
oRoot.appendChild oNode
'
' set node attributes
'
Set oAttrib = m_XML_DOM.createAttribute( "Line")
oAttrib.Text = m_Line
oNode.Attributes.setNamedI tem oAttrib
Set oAttrib = m_XML_DOM.createAttribute( "Offset")
oAttrib.Text = m_Offset
oNode.Attributes.setNamedI tem oAttrib
Set oAttrib = m_XML_DOM.createAttribute( "Length")
oAttrib.Text = m_Length
oNode.Attributes.setNamedI tem oAttrib
Set oAttrib = m_XML_DOM.createAttribute( "ImgID")
oAttrib.Text = m_ImgID
oNode.Attributes.setNamedI tem oAttrib
Set oAttrib = m_XML_DOM.createAttribute( "Address")
oAttrib.Text = m_Address
oNode.Attributes.setNamedI tem oAttrib
m_isModified = True
AddItem = SUCCESS
Set oRoot = Nothing
Set oNode = Nothing
Set oChild = Nothing
Set oAttrib = Nothing
Exit Function
EH:
ProcessError
End Function
Public Function RemoveItem(nLineNo As Long, nOffset As Long) As Boolean
On Error GoTo EH:
RemoveItem = FAIL
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
Set oNode = m_XML_DOM.selectSingleNode ("Markup/H yperLinks" )
Set oChild = SearchItem(nLineNo, nOffset)
If Not oChild Is Nothing Then
oNode.removeChild oChild
RemoveItem = SUCCESS
m_isModified = True
End If
Set oNode = Nothing
Set oChild = Nothing
Exit Function
EH:
ProcessError
End Function
Public Function EditItem(nLineNo As Long, nOffset As Long) As Boolean
On Error GoTo EH:
EditItem = FAIL
Const EditAddr As Byte = 1
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
Dim oUpdateChild As IXMLDOMNode
Set oNode = m_XML_DOM.selectSingleNode ("Markup/H yperLinks" )
'
' set desired node
'
Set oChild = SearchItem(nLineNo, nOffset)
If Not oChild Is Nothing Then
'
' copy old child to child to be updated
'
Set oUpdateChild = oChild
With oUpdateChild.Attributes
If .getNamedItem("ImgID").Tex t <> "" And .getNamedItem("Address").T ext <> "" Then
Dim strTemp As String
Dim strFileOnly As String
strTemp = .getNamedItem("Address").T ext
'
' check for web address
'
If InStr(1, strTemp, "http://") = 0 Then
'
' check for local file
'
If InStr(2, strTemp, ":\") Then
'
' local file, remove the file location
'
strFileOnly = StripPath(strTemp)
'
' change address value
'
.getNamedItem("Address").T ext = strFileOnly
End If
End If
End If
End With
'
' replace old node with updates
'
oNode.replaceChild oUpdateChild, oChild
EditItem = SUCCESS
End If
Set oNode = Nothing
Set oChild = Nothing
Set oUpdateChild = Nothing
Exit Function
EH:
MsgBox Err.Number & Err.Description
ProcessError
End Function
Public Function Load(ByVal szFileName As String) As Boolean
Load = FAIL
'
' Capture VDF File name
'
m_Filename = szFileName
Set m_XML_DOM = New DOMDocument
m_XML_DOM.async = False
'
' open XML document
'
If (m_XML_DOM.Load(m_UserLnkF ile)) Then
'
' seek to desired element
'
Dim oParent As IXMLDOMNode
Set oParent = m_XML_DOM.selectSingleNode ("Markup/H yperLinks" )
If Not oParent Is Nothing Then Load = SUCCESS
Set oParent = Nothing
Else
ProcessError
End If
End Function
Public Function Save(szVDFFile As String) As Boolean
Dim Zip As New CDynaZip
Dim XIBRead As New viVDFReader.VDFXib
Save = FAIL
MoveFirst
'
' Edit to remove temp file directory structure
'
Do While Not EOF
EditItem Line, Offset
MoveNext
Loop
'
' save XML file to temp directory
'
m_XML_DOM.Save m_UserLnkFile
'
' zip file into a file called user.xib
'
If (Zip.AddFile(FullPath, m_UserLnkFile)) Then
'
' save user.xib to the VDF file
'
Save = XIBRead.SaveToZipFile(szVD FFile, FullPath)
End If
End Function
Private Sub ProcessError()
On Error Resume Next
Dim Error As IXMLDOMParseError
Set Error = m_XML_DOM.parseError
m_Error = Error.ErrorCode
m_szError = Error.reason + "Line: " + CStr(Error.Line)
Set Error = Nothing
End Sub
Private Sub Class_Initialize()
m_UserLnkFile = GetTempPath() + UserLNK
End Sub
Private Sub Class_Terminate()
Set m_XML_DOM = Nothing
Set m_ActiveNode = Nothing
End Sub
'here is the XML... it manipulates or creates
'************************* ********** **********
<?xml version="1.0"?>
<Markup>
<HyperLinks>
<Link Line="26" Offset="1102" Length="29" ImgID="" Address="http://www.yahoo.com/"/>
<Link Line="21" Offset="841" Length="24" ImgID="" Address="http://www.search.com/"/>
<Link Line="28" Offset="1216" Length="21" ImgID="" Address="http://www.cnn.com/"/>
<Link Line="37" Offset="1479" Length="27" ImgID="" Address="http://www.otcstreet.com/trivia/otctrivia.cfm"/>
</HyperLinks>
</Markup>
Option Explicit
'Private XML holders
Private m_ActiveNode As IXMLDOMNode
Const UserLNK As String = "Markup.xml"
Const UserFile As String = "User.xib"
'Private Data Members
Private m_BOF As Boolean
Private m_EOF As Boolean
Private m_ImgID As String
Private m_Line As Long
Private m_Offset As Long
Private m_Length As Long
Private m_Address As String
Private m_Filename As String
Private m_isModified As Boolean
Private m_Error As Long
Private m_szError As String
Private m_UserLnkFile As String
'Private Constants
Const SUCCESS As Boolean = True
Const FAIL As Boolean = Not SUCCESS
Public Property Get isModified() As Boolean
isModified = m_isModified
End Property
Public Property Let ImgID(ByVal newVal As String)
m_ImgID = newVal
End Property
Public Property Get ImgID() As String
ImgID = m_ActiveNode.Attributes.ge
End Property
Public Property Let Offset(ByVal newVal As Long)
m_Offset = newVal
End Property
Public Property Get Offset() As Long
If (m_ActiveNode.Attributes.g
Offset = 0
Else
Offset = CLng(m_ActiveNode.Attribut
End If
End Property
Public Property Let Length(ByVal newVal As Long)
m_Length = newVal
End Property
Public Property Get Length() As Long
If (m_ActiveNode.Attributes.g
Length = 0
Else
Length = CLng(m_ActiveNode.Attribut
End If
End Property
Public Property Let Line(ByVal newVal As Long)
m_Line = newVal
End Property
Public Property Get Line() As Long
If (m_ActiveNode.Attributes.g
Line = 0
Else
Line = CLng(m_ActiveNode.Attribut
End If
End Property
Public Property Let Address(ByVal newVal As String)
m_Address = newVal
End Property
Public Property Get Address() As String
Address = m_ActiveNode.Attributes.ge
End Property
Private Property Let EOF(ByVal newVal As Boolean)
m_EOF = newVal
End Property
Public Property Get EOF() As Boolean
EOF = m_EOF
End Property
Private Property Let BOF(ByVal newVal As Boolean)
m_BOF = newVal
End Property
Public Property Get BOF() As Boolean
BOF = m_BOF
End Property
Public Property Get FullPath() As String
FullPath = GetTempPath() + UserFile
End Property
Public Property Get fileName() As String
fileName = m_Filename
End Property
Public Property Get Error() As Long
Error = m_Error
End Property
Public Property Get ErrorDesc() As String
ErrorDesc = m_szError
End Property
Public Sub MoveFirst()
Set m_ActiveNode = m_XML_DOM.selectSingleNode
If Not m_ActiveNode Is Nothing Then
m_BOF = True
m_EOF = False
Else
m_EOF = True
End If
End Sub
Public Sub MoveLast()
If Not m_ActiveNode.lastChild Is Nothing Then
Set m_ActiveNode = m_ActiveNode.lastChild
End If
m_EOF = True
m_BOF = False
End Sub
Public Sub MoveNext()
If Not m_ActiveNode.nextSibling Is Nothing Then
Set m_ActiveNode = m_ActiveNode.nextSibling
Else
m_EOF = True
End If
End Sub
Public Sub MovePrev()
If Not m_ActiveNode.previousSibli
Set m_ActiveNode = m_ActiveNode.previousSibli
Else
m_BOF = True
End If
End Sub
Private Function SearchItem(nLine As Long, nOffset As Long) As IXMLDOMNode
Set SearchItem = m_XML_DOM.selectSingleNode
$eq$ " & nOffset & "]")
End Function
Public Function SetItem(nLineNo As Long, nOffset As Long) As Boolean
SetItem = FAIL
Set m_ActiveNode = m_XML_DOM.selectSingleNode
$eq$ " & nOffset & "]")
If Not m_ActiveNode Is Nothing Then SetItem = SUCCESS
End Function
Public Function AddItem() As Boolean
On Error GoTo EH
AddItem = FAIL
Dim oRoot As IXMLDOMNode
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
Dim oAttrib As IXMLDOMAttribute
If m_XML_DOM Is Nothing Then
Set m_XML_DOM = New DOMDocument
'
' New Document, add headings
'
Set oNode = m_XML_DOM.createProcessing
Set oNode = m_XML_DOM.insertBefore(oNo
'
' Create document roots
'
Set oRoot = m_XML_DOM.createElement("M
Set m_XML_DOM.documentElement = oRoot
Set oChild = m_XML_DOM.createElement("H
oRoot.appendChild oChild
End If
Set oRoot = m_XML_DOM.selectSingleNode
Set oChild = oRoot.selectSingleNode("Hy
'
' Set the root document element to be appended to.
'
Set oRoot = m_XML_DOM.selectSingleNode
'
' add item
'
Set oNode = m_XML_DOM.createElement("L
oRoot.appendChild oNode
'
' set node attributes
'
Set oAttrib = m_XML_DOM.createAttribute(
oAttrib.Text = m_Line
oNode.Attributes.setNamedI
Set oAttrib = m_XML_DOM.createAttribute(
oAttrib.Text = m_Offset
oNode.Attributes.setNamedI
Set oAttrib = m_XML_DOM.createAttribute(
oAttrib.Text = m_Length
oNode.Attributes.setNamedI
Set oAttrib = m_XML_DOM.createAttribute(
oAttrib.Text = m_ImgID
oNode.Attributes.setNamedI
Set oAttrib = m_XML_DOM.createAttribute(
oAttrib.Text = m_Address
oNode.Attributes.setNamedI
m_isModified = True
AddItem = SUCCESS
Set oRoot = Nothing
Set oNode = Nothing
Set oChild = Nothing
Set oAttrib = Nothing
Exit Function
EH:
ProcessError
End Function
Public Function RemoveItem(nLineNo As Long, nOffset As Long) As Boolean
On Error GoTo EH:
RemoveItem = FAIL
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
Set oNode = m_XML_DOM.selectSingleNode
Set oChild = SearchItem(nLineNo, nOffset)
If Not oChild Is Nothing Then
oNode.removeChild oChild
RemoveItem = SUCCESS
m_isModified = True
End If
Set oNode = Nothing
Set oChild = Nothing
Exit Function
EH:
ProcessError
End Function
Public Function EditItem(nLineNo As Long, nOffset As Long) As Boolean
On Error GoTo EH:
EditItem = FAIL
Const EditAddr As Byte = 1
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
Dim oUpdateChild As IXMLDOMNode
Set oNode = m_XML_DOM.selectSingleNode
'
' set desired node
'
Set oChild = SearchItem(nLineNo, nOffset)
If Not oChild Is Nothing Then
'
' copy old child to child to be updated
'
Set oUpdateChild = oChild
With oUpdateChild.Attributes
If .getNamedItem("ImgID").Tex
Dim strTemp As String
Dim strFileOnly As String
strTemp = .getNamedItem("Address").T
'
' check for web address
'
If InStr(1, strTemp, "http://") = 0 Then
'
' check for local file
'
If InStr(2, strTemp, ":\") Then
'
' local file, remove the file location
'
strFileOnly = StripPath(strTemp)
'
' change address value
'
.getNamedItem("Address").T
End If
End If
End If
End With
'
' replace old node with updates
'
oNode.replaceChild oUpdateChild, oChild
EditItem = SUCCESS
End If
Set oNode = Nothing
Set oChild = Nothing
Set oUpdateChild = Nothing
Exit Function
EH:
MsgBox Err.Number & Err.Description
ProcessError
End Function
Public Function Load(ByVal szFileName As String) As Boolean
Load = FAIL
'
' Capture VDF File name
'
m_Filename = szFileName
Set m_XML_DOM = New DOMDocument
m_XML_DOM.async = False
'
' open XML document
'
If (m_XML_DOM.Load(m_UserLnkF
'
' seek to desired element
'
Dim oParent As IXMLDOMNode
Set oParent = m_XML_DOM.selectSingleNode
If Not oParent Is Nothing Then Load = SUCCESS
Set oParent = Nothing
Else
ProcessError
End If
End Function
Public Function Save(szVDFFile As String) As Boolean
Dim Zip As New CDynaZip
Dim XIBRead As New viVDFReader.VDFXib
Save = FAIL
MoveFirst
'
' Edit to remove temp file directory structure
'
Do While Not EOF
EditItem Line, Offset
MoveNext
Loop
'
' save XML file to temp directory
'
m_XML_DOM.Save m_UserLnkFile
'
' zip file into a file called user.xib
'
If (Zip.AddFile(FullPath, m_UserLnkFile)) Then
'
' save user.xib to the VDF file
'
Save = XIBRead.SaveToZipFile(szVD
End If
End Function
Private Sub ProcessError()
On Error Resume Next
Dim Error As IXMLDOMParseError
Set Error = m_XML_DOM.parseError
m_Error = Error.ErrorCode
m_szError = Error.reason + "Line: " + CStr(Error.Line)
Set Error = Nothing
End Sub
Private Sub Class_Initialize()
m_UserLnkFile = GetTempPath() + UserLNK
End Sub
Private Sub Class_Terminate()
Set m_XML_DOM = Nothing
Set m_ActiveNode = Nothing
End Sub
'here is the XML... it manipulates or creates
'*************************
<?xml version="1.0"?>
<Markup>
<HyperLinks>
<Link Line="26" Offset="1102" Length="29" ImgID="" Address="http://www.yahoo.com/"/>
<Link Line="21" Offset="841" Length="24" ImgID="" Address="http://www.search.com/"/>
<Link Line="28" Offset="1216" Length="21" ImgID="" Address="http://www.cnn.com/"/>
<Link Line="37" Offset="1479" Length="27" ImgID="" Address="http://www.otcstreet.com/trivia/otctrivia.cfm"/>
</HyperLinks>
</Markup>
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:
- PAQ'd and pts removed
Please leave any comments here within the
next seven days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER !
Nic;o)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
regards,
CJ