2013-07-05 3 views
3

У меня есть XML-файл ниже. Я хочу пропустить этот файл и извлечь значение узла узла, например, для узла <com> получить значение имени, а затем цикл 2 раза, чтобы получить значения файла. В настоящее время я могу получить значение для узла <com>, но я не уверен, как его зацикливать и получить значения для узла файла.Цитирование через элементы XML-файла

<common> 
    <com name="Test1.css"> 
    <file name="Tech.css"/> 
    <file name="Comp.css"/> 
    </com> 
    <com name="Test2.css"> 
    <file name="HR.css"/> 
    <file name="HR2.css"/> 
    </com> 
</common> 
Dim xmlDoc, objNodeList, plot 
Set xmlDoc = CreateObject("Msxml2.DOMDocument") 
xmlDoc.setProperty "SelectionLanguage", "XPath" 
xmlDoc.load("C:\test\combineXML.xml") 
WScript.Echo xmlDoc.parseError 
Set objNodeList = xmlDoc.getElementsByTagName("com") 
If objNodeList.length > 0 then 
    For each x in objNodeList 
     JobName = x.getattribute("name") 
     WScript.Echo JobName 
    Next 
End If 

ответ

4

Вы можете использовать .ChildNodes Property

Dim xmlDoc, objNodeList, plot 
dim fileNodes 
dim comNodeItem 
dim fileNodeItem 
dim fileName, jobName 

Set xmlDoc = CreateObject("Msxml2.DOMDocument") 

xmlDoc.setProperty "SelectionLanguage", "XPath" 
xmlDoc.load("C:\test\combineXML.xml") 

WScript.Echo xmlDoc.parseError 

Set objNodeList = xmlDoc.getElementsByTagName("com") 

For each comNodeItem in objNodeList 
    JobName = comNodeItem.getAttribute("name") 
    for each fileNodeItem in comNodeItem.ChildNodes 
     fileName = fileNodeItem.getAttribute("name") 
     WScript.Echo JobName & ": " & fileName 
    next 
Next 

Это будет работать, если файл так просто, как ваш пример. Если вы хотите только file узлы должны быть обработаны, и другие игнорируются, вы можете просто использовать снова:

for each fileNodeItem in comNodeItem.getElementsByTagName("file") 
+0

Perfect..Thank у парней так много – user505210

4

Вы делаете это слишком сложно. Просто выберите атрибут name из дочерних узлов всех com узлов с выражением XPath:.

Set xmlDoc = CreateObject("Msxml2.DOMDocument") 
xmlDoc.async = False 
xmlDoc.load "C:\test\combineXML.xml" 
If xmlDoc.parseError = 0 Then 
    For Each x In xmlDoc.selectNodes("//com/*/@name") 
    WScript.Echo x.text 
    Next 
End If 

Используйте //com/file/@name, если вам нужно выражение, чтобы быть более конкретными (в случае, если есть и другие дочерние узлы с атрибутом name

Если вы хотите атрибуты из родительского узла, вы должны изменить это так:

Set xmlDoc = CreateObject("Msxml2.DOMDocument") 
xmlDoc.async = False 
xmlDoc.load "C:\test\combineXML.xml" 
If xmlDoc.parseError = 0 Then 
    For Each x In xmlDoc.selectNodes("//com/*") 
    WScript.Echo x.parentNode.getAttribute("name") & ": " _ 
     & x.getAttribute("name") 
    Next 
End If 
+0

Очень nice..how можно также получить тыс e значения com узла. Например, я хочу получить результат, подобный этому test1 tech.css comp.css, а затем test2.css HR.css HR2.css – user505210

Смежные вопросы