Solved

How can I get the attribute value?

Posted on 2001-08-21
18
331 Views
Last Modified: 2013-11-19
I have one asp page, inside this page I want to parse a xml file, I want to get the value of attrbutes of nodes. I know this works in vb component, Node.childnodes(i).attributes.getNameItem("name").text, but it doesn't work in asp. I want to know the proper syntex.
0
Comment
Question by:huixu01
  • 6
  • 5
  • 5
  • +2
18 Comments
 
LVL 7

Accepted Solution

by:
John844 earned 50 total points
ID: 6411186
Node.childnodes(i).attributes.getNameItem("name").text
I think should be
Node.childnodes(i).attributes.getNamedItem("name").text
0
 
LVL 7

Expert Comment

by:John844
ID: 6411204
I have always used the item collection within the childNodes like
Node.childnodes.Item(i).attributes.getNamedItem("name").text
I don't remember if it works both ways or not.
John
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6411273
Here is a class module I use to manipulate XML, For your purpose look at the "EditItem" Function.  

Enjoy!

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.getNamedItem("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.getNamedItem("Offset").Text) = "" Then
       Offset = 0
   Else
       Offset = CLng(m_ActiveNode.Attributes.getNamedItem("Offset").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.getNamedItem("Length").Text) = "" Then
       Length = 0
   Else
       Length = CLng(m_ActiveNode.Attributes.getNamedItem("Length").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.getNamedItem("Line").Text) = "" Then
       Line = 0
   Else
       Line = CLng(m_ActiveNode.Attributes.getNamedItem("Line").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.getNamedItem("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/HyperLinks/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.previousSibling Is Nothing Then
       Set m_ActiveNode = m_ActiveNode.previousSibling
   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/HyperLinks/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/HyperLinks/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.createProcessingInstruction("xml", "version='1.0'")
       Set oNode = m_XML_DOM.insertBefore(oNode, m_XML_DOM.childNodes.Item(0))
       
       '
       ' Create document roots
       '
       Set oRoot = m_XML_DOM.createElement("Markup")
       Set m_XML_DOM.documentElement = oRoot
       
       Set oChild = m_XML_DOM.createElement("HyperLinks")
       oRoot.appendChild oChild

   End If
   

   Set oRoot = m_XML_DOM.selectSingleNode("Markup")
   Set oChild = oRoot.selectSingleNode("HyperLinks")
   
   '
   ' Set the root document element to be appended to.
   '
   Set oRoot = m_XML_DOM.selectSingleNode("Markup/HyperLinks")
   
   '
   ' add item
   '
   Set oNode = m_XML_DOM.createElement("Link")
   oRoot.appendChild oNode
   
   '
   ' set node attributes
   '
   Set oAttrib = m_XML_DOM.createAttribute("Line")
   oAttrib.Text = m_Line
   oNode.Attributes.setNamedItem oAttrib
   
   Set oAttrib = m_XML_DOM.createAttribute("Offset")
   oAttrib.Text = m_Offset
   oNode.Attributes.setNamedItem oAttrib
   
   Set oAttrib = m_XML_DOM.createAttribute("Length")
   oAttrib.Text = m_Length
   oNode.Attributes.setNamedItem oAttrib
   
   Set oAttrib = m_XML_DOM.createAttribute("ImgID")
   oAttrib.Text = m_ImgID
   oNode.Attributes.setNamedItem oAttrib
   
   Set oAttrib = m_XML_DOM.createAttribute("Address")
   oAttrib.Text = m_Address
   oNode.Attributes.setNamedItem 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/HyperLinks")
   
   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/HyperLinks")
   
   '
   ' 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").Text <> "" And .getNamedItem("Address").Text <> "" Then
               
               Dim strTemp         As String
               Dim strFileOnly     As String
               
               strTemp = .getNamedItem("Address").Text
               
               '
               ' 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").Text = 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_UserLnkFile)) Then
       
       '
       ' seek to desired element
       '
       Dim oParent         As IXMLDOMNode
       
       Set oParent = m_XML_DOM.selectSingleNode("Markup/HyperLinks")
       
       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(szVDFFile, 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
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:huixu01
ID: 6411274
It does't work. The error message I got is
Microsoft VBScript runtime (0x800A01A8)
Object required: 'oXML.documentelement.childnodes(...).attributes'.
If you want to pass Node object to function what's the syntex. Becase I have function ,I pass Node.xml to function instead of node object, inside the function If I want to output name of node, it always like "#text", I don't know what's wrong.
If you want to test to see whether or not a node has attribute what's the syntax.
0
 

Author Comment

by:huixu01
ID: 6411284
It does't work. The error message I got is
Microsoft VBScript runtime (0x800A01A8)
Object required: 'oXML.documentelement.childnodes(...).attributes'.
If you want to pass Node object to function what's the syntex. Becase I have function ,I pass Node.xml to function instead of node object, inside the function If I want to output name of node, it always like "#text", I don't know what's wrong.
If you want to test to see whether or not a node has attribute what's the syntax.
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6411307
It should be something like

oNode.Attributes.getNamedItem("Name").Text
0
 
LVL 7

Expert Comment

by:John844
ID: 6411320
trying to read the attribute value when there is not one will always generate an error.

you can create a function to check existence like

function AttributeExists(node, strAttribute)
    on error resume next

    dim strTemp

    strTemp = node.attributes.getNameItem("name").text

    'trap for error
    if Err.number <> 0 then
        AttributeExists = False
    else
        AttributeExists = True
    end if
end function

ps, I have not tried to run this function, just typed it in.
0
 
LVL 7

Expert Comment

by:John844
ID: 6411331
Or maybe better yet, create a function to pull your attribute.  Pass a default value to use if attribute is not there

function GetAttributeValue(node, strAttribute, strDefault)
   on error resume next

   dim strTemp

   strTemp = node.attributes.getNameItem("name").text

   'trap for error
   if Err.number <> 0 then
       GetAttributeValue = strDefault
   else
       GetAttributeValue = strTemp
   end if
end function

ps, I have not tried to run this function, just typed it in.
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6411353
John,

If you are going to cut and paste my code into your solution, I would appreciate the credit.

Thanks

Dave
0
 

Author Comment

by:huixu01
ID: 6411415
It always return the default value, it does't work. Sorry.
0
 

Author Comment

by:huixu01
ID: 6411439
It always return the default value, it does't work. Sorry.
0
 

Author Comment

by:huixu01
ID: 6411488
It always return the default value, it does't work. Sorry.
0
 
LVL 2

Expert Comment

by:turbosig
ID: 6412106
Here is alot of junk, but is shows you haw to use the getattribute:

sub document_onmouseover
     set curObj = window.event.srcElement
     if left(curObj.id,3) = "cmd" then
          if  not curObj.disabled then
               curObj.classname = "cmdMouseOver"
          end if    
     end if
     if not isnull(curObj.getAttribute("statustext")) then
          window.status = curObj.getAttribute("statustext")
     end if
end sub


~Turbosig (should be some code inhere you can use.)
0
 
LVL 7

Expert Comment

by:John844
ID: 6413392
Dave, Had I cut a pasted your code, you would get credit from me.  I did not cut one line of code from you.

BTW:  First of all, a major rule in web development is don't use property set,get and lets.  Number 2 huizu01 stated that he already knew how to do this in VB therefore another vb example should not be needed.  

John
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6413624
John, I'll give you a 100 point question and an "A" if you can provide me with the con's of get/set/let`s for the web.  

I have never heard that, and would like to know what is wrong with it.

Thanks
-Dave
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6413637
I'm going to post that question on get/set/let... be looking for it!
0
 

Author Comment

by:huixu01
ID: 6414089
This syntex is right. Because I have recursive function, so last node is text, it does't have collection of attribute, so I need to use Node.childnodes(i).parentnode.attributes.getNameItem("name").text.
0
 
LVL 3

Expert Comment

by:davlun20080
ID: 6414112
Try this one in asp....

<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>

<BODY BGCOLOR="#FFFFFF">
<%
     dim xmlString, oXML, strOwners

     ' use some xml
     xmlString = "<list><owner status=""1"">Ahmad</owner><owner status=""2"">Ali</owner><owner status=""3"">Minah</owner><owner status=""4"">Ahmad</owner></list>"


     ' set up object
     set oXML = server.CreateObject("Microsoft.XMLDOM")
     oXML.async = false
     oXML.loadxml xmlString

%>
     <SELECT NAME=Value>
          <OPTION VALUE="">Pick one </option>
<%
     ' get the owners from the xml doc
     set selNodes= oXML.selectNodes("//owner")

     ' start the string of owners to check against
     strOwners = "|"

     ' loop through the nodes in the list, write them out if not already present
     for each item in selNodes

          if instr(strOwners, "|" & item.text & "|") = 0 then
               strOwners = strOwners & item.text & "|"

               response.write "<option value=""" & item.attributes.getNamedItem("status").text & "2"">" & item.text & "</option>"
          end if
     
     next
%>
     </select>
</BODY>
</HTML>
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface In the first article: A Better Website Login System (http://www.experts-exchange.com/A_2902.html) I introduced the EE Collaborative Login System and its intended purpose. In this article I will discuss some of the design consideratio…
Shoutout to Emily Plummer (http://www.experts-exchange.com/members/eplummer26.html) for giving me this article! She did most of it, I just finished it up and posted it for her :)    Introduction In a previous article (http://www.experts-exchang…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

680 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question