2012-03-15 22 views
6

Estoy tratando de escribir un script que manipule algunos datos en un archivo xml. Soy bastante nuevo en VBScript pero tengo un fondo de VB.NET y VBA, así que me siento como si supiera lo que estoy haciendo.Navegando nodos XML en VBScript, para un Dummy

Pensé que probablemente había una mejor manera de navegar por el archivo en lugar de llamar mucho a InStr() o similar para cada línea para ver si lo que busco está allí. Mi idea inicial fue utilizar algunos métodos que he visto en VB.NET desde System.XML, ya que había visto las funciones de navegación de nodos y miembros en eso.

Después de investigar esto, no puedo encontrar ninguna forma de importar un espacio de nombres (System.XML, u otro) en VBScript sin que se ejecute en una página web. Decidí buscar otras opciones en lugar de perder más tiempo buscando esto.

Resulta que hay otras maneras de hacer lo que quiero, usando métodos y objetos que tratan específicamente con la navegación de nodos de un archivo XML. Aprendí que algunos ejemplos comunes de estos "sistemas" (por falta de un término mejor, porque estoy seguro de que es incorrecto) parecen ser DOM y XPath.

Empecé investigando XPath (ya que había visto XPath juzgado superior a DOM en algunos lugares, como: Traversing all nodes in an XML file with VBScript). No pude encontrar nada para describir los conceptos básicos de XPath en vbscript. Hay muchos en la sintaxis para las rutas y tal, pero no pude encontrar nada que describa los conceptos básicos de cómo llamar realmente a esa sintaxis en VBScript para hacer uso de ella. Así que pasé a la siguiente opción.

Luego encontré muchos artículos/preguntas/etc. ligeramente diferentes sobre DOM. Así que lo probé. Ninguno de ellos funcionó, todos me dieron errores. En su mayoría, parece que un objeto DOM nunca se carga correctamente. Éstos son sólo algunos de los métodos que he probado para esto:

De MSDN: a beginner's guide to XML DOM:

Set objParser = CreateObject("Microsoft.XMLDOM") 
Dim xDoc As MSXML.DOMDocument 
Set xDoc = New MSXML.DOMDocument 

If xDoc.Load("C:\My Documents\cds.xml") Then 
    msgbox("Success!") 
Else 
    msgbox("Failure!") 
End If 

Este devolvió un error cada vez.

Based on another method:

dim xmlDom 
set xmlDom = createobject("MSXML2.DOMDocument") 
xmlDom.async = false 
xmlDom.load ("C:\MyFileLocation\MyFile.xml") 

y luego he intentado un par de cosas para detectar si ha funcionado como cuadros de mensaje para cada nombre de nodo en xmlDom.documentElement.

He intentado tantas otras cosas que ni siquiera puedo recordar la mayoría de ellas.

Simplemente no sé qué más puedo probar o por qué esto no funciona para mí. Simplemente estoy perdido por lo que más puedo probar de manera diferente mientras sigo teniendo sintaxis que PODRÍA funcionar.

Así que mi pregunta es: ¿cómo puedo navegar un archivo XML usando VBScript sin que el script esté incrustado en una página web o de otra manera? Necesito saber los fundamentos extremos.

Sé que mi pregunta probablemente parezca estúpida e ignorante, ya que esta debería ser información fácilmente disponible, pero realmente no puedo encontrar elementos básicos que necesito para entender cómo navegar por los nodos de CUALQUIER MANERA con JUST VBScript (no en un archivo html o asp o algo así).

+0

El primer método nunca va a funcionar en VBScript, porque está escrito para VBA. Eso son diferentes sabores. En VBScript, no puede asignar un tipo a una variable como 'Dim XDoc As MSXML.Document'. Tienes que atenuarlo y luego configurarlo con un documento recién creado como el segundo método. El error en el segundo método es el nombre de ruta, que tiene que ser una cadena: 'xmlDom.load" C: \ MyFileLocation \ MyFile.xml "'. Su pregunta no es desconocida, los datos de VBScript y XML son un poco difíciles; Los métodos no son muy claros y no están muy bien documentados. El ejemplo de fmunkert te daría un buen comienzo. – AutomatedChaos

+0

en realidad, el error en el segundo método fue un error en mí al transferir el código aquí, creo. Estoy bastante seguro de haberlo intentado antes. ¡gracias por señalar eso! Además, gracias por el bit sobre vba vs vbscript: en la página msdn, la primera línea da un ejemplo con vbscript, luego el resto está en vba. gracias msdn:/ – user1167662

Respuesta

15

Aquí hay un pequeño ejemplo:

Suponga que tiene un archivo llamado C:\Temp\Test.xml con el siguiente contenido:

<?xml version="1.0"?> 
<root> 
    <property name="alpha" value="1"/> 
    <property name="beta" value="2"/> 
    <property name="gamma" value="3"/> 
</root> 

continuación, puede utilizar esta VBScript:

Set objDoc = CreateObject("MSXML.DOMDocument") 
objDoc.Load "C:\Temp\Test.xml" 

' Iterate over all elements contained in the <root> element: 

Set objRoot = objDoc.documentElement 
s = "" 
t = "" 
For Each child in objRoot.childNodes 
    s = s & child.getAttribute("name") & " " 
    t = t & child.getAttribute("value") & " " 
Next 
MsgBox s ' Displays "alpha beta gamma " 
MsgBox t ' Displays "1 2 3 " 

' Find a particular element using XPath: 

Set objNode = objDoc.selectSingleNode("/root/property[@name='beta']") 
MsgBox objNode.getAttribute("value")  ' Displays 2 

Espero que esto ayude comenzando con VBScript y XML.

+0

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Muchíiiiiiiiiiiiiiiiiiiiiiiiísimo !!!!! ¡Esto fue extremadamente útil! Aunque esto no es todo, es suficiente para que todo salga bien, así puedo descifrar el resto :) ¡gracias de nuevo! – user1167662

+0

¿Cuáles son algunos otros métodos o miembros útiles relacionados con un DOMDocument? ¿Hay algún lugar con ellos bien documentado? En este momento me estoy preguntando específicamente sobre un método de tipo "selectnodeswhich ..." o algo para seleccionar varios nodos en lugar de uno. – user1167662

+3

Puede encontrar una lista de métodos y propiedades de IDOMDocument aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/ms757878(v=vs.85).aspx. Para seleccionar múltiples nodos, use 'selectNodes', junto con XPath. Si no está familiarizado con XPath, lea el tutorial en http://www.w3schools.com/xpath/xpath_intro.asp. –

Cuestiones relacionadas