2

ここ数日、XML ファイルの操作について読んでいて、頭を悩ませています。

属性を取得して値を変更するのは簡単なようですが、実現できません。

input.xml という次の XML ファイルがあります。

<gs:GlobalizationService xmlns:gs="urn:longhornGlobalizationUnattend">
    <gs:UserList>
        <gs:User UserID="Current"/>
    </gs:UserList>
    <gs:InputPreferences>
        <gs:InputLanguageID Action="add" ID="0409:00000409" Default="true"/>
    </gs:InputPreferences>
</gs:GlobalizationServices>

属性 ID の値を変更できる必要があります。selectSingleNode と setAttribute コマンドの組み合わせを使用してこれを達成できるはずですが、機能させることができません。

私が試してきたことのスニペットは次のとおりです。値は、ユーザーの選択に基づいてメイン スクリプトの別の場所で定義されます。

Dim xmlDoc, xmlNode
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.Async = "False"
xmldoc.Load("input.xml")

Set xmlNode = xmlDoc.selectSingleNode("gs:GlobalizationServices/gs:InputPreferences/gs:InputLanguageID")
xmlNode.setAttribute "ID", Value
xmlDoc.save("input.xml")
4

2 に答える 2

0

(1)次のような基本的なエラーチェックを備えたスケルトンを使用する

Dim oFS    : Set oFS  = CreateObject("Scripting.FileSystemObject")
Dim sFSpec : sFSpec   = oFS.GetAbsolutePathName("...")
Dim oXML   : Set oXML = CreateObject("Msxml2.DOMDocument")
oXML.setProperty "SelectionLanguage", "XPath"
' If namespace(s)
' oXML.setProperty "SelectionNamespaces", "...'"
oXML.async = False
oXML.load sFSpec
If 0 = oXML.parseError Then
   WScript.Echo oXML.xml
   WScript.Echo "-----------------"
   Dim sXPath : sXPath    = "..."
   Dim ndFnd  : Set ndFnd = oXML.selectSingleNode(sXPath)
   If ndFnd Is Nothing Then
      WScript.Echo sXPath, "not found"
   Else
      WScript.Echo ndFnd.nodeName, ndFnd.getAttribute("UserID")
      WScript.Echo "-----------------"
      ndFnd.setAttribute "UserID", "Changed"
      WScript.Echo oXML.xml
      oXML.save Replace(sFSpec, ".xml", "-o.xml")
   End If
Else
   WScript.Echo oXML.parseError.reason
End If

(2)ファイル仕様を入力した後、XMLが整形式ではないことに気付きます。

script 13589885.vbs
nd tag 'gs:GlobalizationServices' does not match the start tag 'gs:GlobalizationService'.

(3)XMLには(a)名前空間が含まれているため、次のものが必要です。

oXML.setProperty "SelectionNamespaces", "xmlns:gs='urn:longhornGlobalizationUnattend'"
...
Dim sXPath : sXPath    = "/gs:GlobalizationService/gs:UserList/gs:User"

(4)そして今では明らかに故障していません:

cscript 13589885.vbs
<gs:GlobalizationService xmlns:gs="urn:longhornGlobalizationUnattend">
        <gs:UserList>
                <gs:User UserID="Current"/>
        </gs:UserList>
        <gs:InputPreferences>
                <gs:InputLanguageID Action="add" ID="0409:00000409" Default="true"/>
        </gs:InputPreferences>
</gs:GlobalizationService>

-----------------
gs:User Current
-----------------
<gs:GlobalizationService xmlns:gs="urn:longhornGlobalizationUnattend">
        <gs:UserList>
                <gs:User UserID="Changed"/>
        </gs:UserList>
        <gs:InputPreferences>
                <gs:InputLanguageID Action="add" ID="0409:00000409" Default="true"/>
        </gs:InputPreferences>
</gs:GlobalizationService>

(5)なぜVBScriptが悪いのかxmldoc.Load("input.xml")を考えてみてください。xmlDoc.save("input.xml")

于 2012-11-28T11:38:19.330 に答える
0

XPathセレクターを使用してそれを行い、セレクターをコンパイルする必要があります。サードパーティのライブラリを使用する必要はないと思います。JDKには必要なものが揃っていると思います。Google で検索すると例があります。

于 2012-11-27T21:38:17.830 に答える