0

削除する必要がある特定の XML ノードを選択できないという問題があります。一部の XML ファイルでは正常に機能する XPath を使用してノードを選択しようとしましたが、より複雑なファイル内のノードの正しい XPath を見つけることができません。

ユーザーが特定のノードを選択し、パスに列挙がなくても正確な XPath を受け取ることができるように、XML ファイルをロードできるフリーウェア ツールを知っている人はいますか?

/root/anything[2]<-- 残念ながら、要素の数が変わる可能性があるため、そのようなステートメントは使用できません。属性に基づく式が必要です。

この操作用のフリーウェア ツールがない場合、必要なノードを選択する別の方法を知っている人はいますか?

XML サンプル:

ルート ノード: SmsFormData

属性: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" FormatVersion="1.0" xmlns=" http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework"

子ノード:フォーム

属性: Id="some GUID" CustomData="some data" FormType="some type" ForceRefresh="false"

子/子ノード:ページ

子/子/子ノード:ページ

属性: VendorId="VendorName" Id="some GUID" Assembly="dll ファイル名" Namespace="some Namespace" Type="some Type" HelpID="">

この特定のページを選択するための xPath 式は次のようになります。

xPath = /SmsFormData/Form/Pages/Page[@Id="some Guid"]

選択を行うために、次の vbscript コードを使用しています。

Set objDOM = CreateObject("Msxml2.DOMDocument.4.0") 
objDOM.async = false            
objDOM.load(file)       
set objNode = objDOM.selectSingleNode(xPath)

問題は、objNodeオブジェクトが空であることです。ノードが選択されていませんが、なぜですか?

4

8 に答える 8

2

これはデフォルトの名前空間の問題です。XML を読み込んだ後、次のコードを含めてみてください。

objDom.SetProperty "SelectionNamespaces", "xmlns:cf=""http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework"""

cf次に、XPath でこのプレフィックスを使用します。

objDom.SelectSingleNode("/cf:SmsFormData/cf:Form/cf:Pages/cf:Page[@Id='Some Guid']")

これは少し奇妙に思えるかもしれませんが、意図的な動作です。詳細については、http://support.microsoft.com/kb/288147を参照してください。http: //msdn.microsoft.com/en-us/library/ms950779.aspxも役立つ場合があります。

于 2008-10-06T11:17:34.993 に答える
0

迅速な返信ありがとうございます!これは確かに単純なケースでは機能しますが、私の特定のケースでは機能しません:(

したがって、詳細を見てみましょう。

ルートノード: SmsFormData

属性: xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" FormatVersion = "1.0" xmlns = " http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework "

子ノード:フォーム

属性: Id = "some GUID" CustomData = "Some data" FormType = "some type" ForceRefresh = "false"

子/子ノード: ページ

子/子/子ノード:ページ

属性: VendorId = "VendorName" Id = "some GUID" Assembly="dllファイル名"Namespace= "some Namespace" Type = "some Type" HelpID = "">

この特定のページを選択するためのxPath式は次のようになります。

xPath = "/ SmsFormData / Form / Pages / Page [@ Id =" some Guid "]"

選択を行うために、次のvbscriptコードを使用しています。

Set objDOM = CreateObject("Msxml2.DOMDocument.4.0") 

objDOM.async = false        
objDOM.load(file)       

set objNode = objDOM.selectSingleNode(xPath) 

問題は、objNodeオブジェクトが空になっていることです。ノードが選択されていませんが、なぜですか?

ちなみに、Visual XPathのヒントをありがとう!私はそれを使ってみましたが、残念ながらそれは列挙方法を行います:/

于 2008-10-06T10:27:58.137 に答える
0

問題は、デフォルトの名前空間があることです。XPath のデフォルトの名前空間は、常に「名前なし」の名前空間です。

必要なもの:-

sNamespaces = "xmlns:cf='http://schemas.microsoft.com/SystemsManagementServer/2005/03/ConsoleFramework'"
objDOM.setProperty "SelectionNamespaces", sNamespaces

XPath で使用できるようになりました:-

xPath = "/cf:SmsFormData/cf:Form/cf:Pages/cf:Page[@Id=""some Guid""]"
于 2008-10-06T11:17:04.170 に答える
0

を使用して、選択言語を XPath に設定する必要があります。

objDOM.SetProperty "SelectionLanguage", "XPath"

このプロパティを設定すると、完全な XPath を使用して必要な要素にアクセスできます

于 2008-10-06T10:32:19.813 に答える
0

Firefox ブラウザーを使用している場合は、DOM Inspector (Firefox 3.0 でのみ必要) と XPather 拡張機能を簡単にインストールできます。次に、DOM Inspector ウィンドウで目的のノードに移動すると、対応する XPath が同じウィンドウの XPather ツールバーに表示されます。

DOM インスペクタ: https://addons.mozilla.org/en-US/firefox/addon/6622

XPather: https://addons.mozilla.org/en-US/firefox/addon/1192?id=1192

XPather は、ノードを識別するために可能な限り (列挙ではなく) 属性を使用しているようです (少なくとも、私の小さな実験で見つけたものです...)。それが役立つことを願っています...

于 2008-10-06T10:33:21.730 に答える
0

それがあなたに役立つかどうかはわかりませんが、同様の問題がありました。

管理が必要なアプリで生成された XML ファイルがありました。次の形式でした。 <LoginData> <GeneralData> <LoginMask>65537</LoginMask> </GeneralData> <UserData> <User> <Username>TEST0</Username> ... </User> <User> <Username>TEST1</Username> ... </User> </UserData> </LoginData>

ユーザー名を一致させ、他のユーザー タグを削除する必要がありました。

私 (完全な XML 初心者) はそれを解決するのに何年もかかりましたが、最終的にはノードのマッチングと親ノードの子の削除に行き着きました:

x.getElementsByTagName("Username").item(0).text = "TEST1" の場合、oXmlDoc.documentElement.selectSingleNode("UserData").childNodes の各 x に対して、exx = x.getElementsByTagName("Username").item を設定します。 (0) wscript.echo(x.getElementsByTagName("Username").item(0).text) wScript.echo(x.nodename & ": " & x.text) x.parentNode.removeChild(x) end if next

于 2009-01-19T22:35:20.367 に答える
0

次の XML があるとします。

<root>
  <anything foo="bar">value1</anything>
  <anything foo="qux">value2</anything>
</root>

...XPath式を使用して、2番目のanythingノードの値を取得できます:

/root/anything[@foo="qux"]

(したがって、番号付きインデックスの代わりに、@property="value" をセレクターとして使用します)。

このようなクエリを自動的に生成するツールについては、適切な名前のVisual XPathが役に立ちます。これは無料です (C# ソース コードも付属しています)。

投稿者によるフォローアップの後に編集: この形式の XPath 選択は、最も複雑なドキュメントの場合と同様に、「単純なケース」でも機能します。もちろん、XPath 式が正しいことを確認する必要があります。Visual XPath は実際に数値インデックスを使用しますが、少なくとも式の残りの部分が得られ、 @property="value" セレクターを簡単に置き換えることができます。番号を入力し、結果をテストします。

上記の XML の例を考えると、この VBscript は次のようになります。

objDOM.selectSingleNode("/root/anything[@foo=""qux""]/text()").nodeValue

...文字列「value2」を返します: 必要に応じて、少し調整する必要がある場合があります (ここでも、Visual XPath などのツールや適切なXPath リファレンスが役に立ちます)。

于 2008-10-06T09:59:35.307 に答える
0

うーん... 問題はファイル ベースに違いないという印象を受けました。SelectionLanguage のプロパティを設定し、列挙された XPath (FireFox XPather を使用して取得) を使用しても、ノード Object は空のままです。

誰が何が間違っているのか考えていますか? xml ファイルは Microsoft アプリケーションに付属しているため、有効である必要があります。少なくとも、ファイルを開いたりアプリケーション内で使用したりするときに問題はないので、構文は問題ないはずです。

または、xml ファイル全体を反復処理して必要なノードを見つけて削除する vbscript 関数を誰かが持っているのでしょうか?

于 2008-10-06T11:09:14.107 に答える