ここでの初めてのポスターであり、VBscript の初心者です。これを第二の性質のように知っている皆さんからの助けを本当に借りることができます. 私はいくつかの関連情報を含めようとしましたが、多すぎないことを願っています.
私はこれを機能させようとしてきましたが、数日間の試行と数十回のコードの反復の後、最終的に手を差し伸べています。XML ドキュメント内の複数のレベル (noes と chidlren) からデータを抽出する例は見つかりませんでした。
私は、VBScript を使用して XML ファイルからデータを抽出する任務を負っています。具体的な項目は次のとおりです。年、口座番号、現在の未払い額、延滞がありますか? (true/false) および書式付き令状番号。
XML ファイルの形式は次のとおりです。1,000 から 10,000 以上のノードがこのデータで満たされ、そこには多数の「その他」ノードも含まれています。
<BillData>
<BillHeader>
<Year>2010</Year>
<misc></misc>
<misc2></misc2>
<misc3></misc3>
<AcctNumber>0002566129</AcctNumber>
<misc4></misc4>
<PayAmounts>
<CurrentAmountDue>133.06</CurrentAmountDue>
<misc5></misc5>
</PayAmounts>
<misc6></misc6>
<HasDelinquents>true</HasDelinquents>
<WarrantInfo>
<FormattedWarrantNumber>201115447</FormattedWarrantNumber>
</WarrantInfo>
</BillHeader>
</BillData>
CurrentAmountDue と FormattedWarrantNumber は常に存在するとは限りません。これは空白という意味ではありませんが、以下に示すように、CurrentAmountDue のエントリ全体が欠落している可能性があります。
<PayAmounts>
<misc5></misc5>
</PayAmounts>
このデータをカンマ区切りのテキスト ファイルに抽出する必要があります。データが存在しない場合は、コマンドを挿入するだけでよいため、出力が最終的に Excel にインポートされると、空白であることがわかります。
私にとっての課題は、さまざまな子ノードに入り、データを正しく抽出することです。異なるノードを正しく選択できないようです。
これらは私が参照として使用したいくつかのリンクですが、機能していないようです。
http://technet.microsoft.com/en-us/magazine/2007.02.heyscriptingguy.aspx これは進むべき方向のように見えましたが、「Node Test Expected Here」というエラーが表示されます。
Set colNodes=xmlDoc.SelectNodes("/BillData/BillHeader/*" (Year | Account | CurrentAmountDue)")
以下のこの手法の使用を提案する Stack に関する投稿を見つけましたが、2 つの値を超えるとうまくいきません。これは、CurrentAmountDue と FormattedWarrantNumber が、いわば XML のより深いレベルにあるためだと推測しています。
strQuery = "/BillData/BillHeader/ " & _
"[name()='Year' or name()='AccountNumber' or name()='HasDelinquents' or name()='CurrentAmountDue' or name()='FormattedWarrantNumber']"
驚いたことに、これを取得して一部の値を返すことができますが、すべてが同じループにあるわけではないため、出力はオフになり (最初の行には年のみが表示され、最後の行は欠落しています)、単なるコンマです。
strQuery = "/BillData/BillHeader/*"
Set colNodes=xmlDoc.selectNodes(strQuery)
For Each objNode in colNodes
' some lame if then statements that get the values, but this can't be the correct approach!
' these three items (Year, Account and HasDelinquents are under each BillHeader as far as I can tell, but this doesn't seem to be the most effective method.
if objNode.nodeName = "Year" then strYear = objNode.text
if objNode.nodeName = "Account" then strAccount = objNode.text
if objNode.nodeName = "HasDelinquents" then strHasDelq = objNode.text
for each CurrentAmt in objNode.SelectNodes("./CurrentAmountDue")
strCurrAmt = CurrentAmt.text
' i finally got a value here when I use msgbox to view it.'
next
for each WarrantNum in objNode.SelectNodes("./FormattedWarrantNumber")
strWarNum = WarrantNum.text
' getting this value also when I use msgbox to view it.
next
next
だから、私の試みが無駄であることがわかります。
また、この行を下に挿入しようとしました。最後のNEXTの直前に入れましたが、意図したとおりに動作しませんでした。また、いくつかの IF-Then ステートメントを挿入して、ファイルに書き込む前に Year と Account の値をチェックし、ファイルに書き込んだ後に値を消去しようとしました。それはほとんどうまくいきましたが、私の最初の行と最後の行は正しいデータを生成していません.
objFileToWrite.WriteLine(strYear & "," & strAccount & "," & strCurrAmt & "," & strHasDelq & "," & strWarNum)
先史時代の私のコーディングの試みを笑い飛ばしてしまったので、手を貸してくれませんか? :)他に何か必要な場合はお知らせください。投資してくれてありがとう。私はあなたの何人かがこれを簡単に蹴ることができることを知っています.