2016-11-09 13 views
0

私はこのようになりTXTとXMLがあります解析するXMLデータ

一時-4.txt

1907| 
233845| 
4187| 
4668| 
5471|

VendorConfig.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Vendors> 
    <Vendor> 
    <SourceID>210986|</SourceID> 
    <SourceName>Rise Commercial Services|SPRING-330RAYFO</SourceName> 
    <DestName>Rise Commercial Services|SPRING-330RAYFO</DestName> 
    </Vendor> 
    <Vendor> 
    <SourceID>1907|</SourceID> 
    <SourceName>Franklin Machine Products Inc|LUMBER-10MTHOL</SourceName> 
    <DestName>Franklin Machine Products Inc1907|</DestName> 
    </Vendor> 
    <Vendor> 
    <SourceID>233845|</SourceID> 
    <SourceName>Coastline Electric Co Inc233845|</SourceName> 
    <DestName>Coastline Electric Co Inc233845|</DestName> 
    </Vendor> 
</Vendors> 

TXTファイル内の各広告申込情報をループし、VBScriptを使用してVendorConfig.xmlにそれが存在するかどうかを確認する必要があります。 SourceIDとしてXMLに存在する場合は、XMLから追加情報を追加する必要があります。 SourceIDとしてXMLに存在しない場合は、エラーメッセージを追加する必要があります。私はこれまでのところ、次のようになりましたが、XMLパーサは、任意のマッチを返すように見えないし、私はその理由を把握することはできませんもの:

VBSCRIPT

Set objXMLDoc = CreateObject("Microsoft.XMLDOM") 
objXMLDoc.async = False 
objXMLDoc.load("C:\myAbsolutePath\VendorConfig.xml") 
If objXMLDoc.parseError.errorCode <> 0 Then 
    MsgBox ("XML connection error detected.") 
End If 

Set Root = objXMLDoc.documentElement 
Set NodeList = Root.getElementsByTagName("Vendor") 

Dim AddVendorDetails, InputFile, FSO, oFile, strTempSourceIDs 
InputFile = "C:\myAbsolutePath\temp-4.txt" 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set oFile = FSO.OpenTextFile(InputFile) 
strTempSourceIDs = oFile.ReadAll 
oFile.Close 

Dim splitCounter 
Dim splitCatcher 
Dim IDtest 

SplitCatcher = Split(strTempSourceIDs, vbCrLf) 
For splitCounter = 0 To UBound(SplitCatcher) 
    IDtest = SplitCatcher(splitCounter) 
    For Each i In NodeList 
     If IDtest = i.getElementsByTagName("SourceID")(0).nodeValue Then 
      Dim IDnode 
      Dim Sourcenode 
      Dim Destnode 
      Set SourceID = i.getElementsByTagName("SourceID")(0) 
      Set SourceName = i.getElementsByTagName("SourceName")(0) 
      Set DestName = i.getElementsByTagName("DestName")(0) 

      If SourceID.nodeValue <> "" Then 
       IDnode = SourceID.nodeValue 
      Else 
       IDnode = "ERROR:Undefined ID" 
      End If 
      If SourceName.nodeValue <> "" Then 
       Sourcenode = SourceName.nodeValue 
      Else 
       Sourcenode = "(No Source Name in config files)" 
      End If 
      If DestName.nodeValue <> "" Then 
       Destnode = DestName.nodeValue 
      Else 
       Destnode = "(No Dest Name in config files)" 
      End If 

      AddVendorDetails = IDnode & vbCrLf 
      AddVendorDetails = AddVendorDetails & "SourceName: " & Sourcenode & vbCrLf 
      AddVendorDetails = AddVendorDetails & "DestName: " & Destnode & vbCrLf 
      If SourceID.nodeValue <> "" Then 
       MsgBox (AddVendorDetails) 
      End If 
      strTempSourceIDs = Replace(strTempSourceIDs, IDnode, AddVendorDetails) 
     End If 
    Next 
Next 

strTempSourceIDs = "######################## " & WeekdayName(Weekday(Date)) & Date & " ########################" & vbCrLf & strTempSourceIDs 
MsgBox (strTempSourceIDs) 

答えて

0

getElementsByTagNameのISNを」 IDtestがSourceIDの値を取得していないようにします。

このようにコードすれば、動作します。すでに自分を発見したよう

Set objXMLDoc = CreateObject("Microsoft.XMLDOM") 
objXMLDoc.async = False 
objXMLDoc.load("C:\users\jdarling\20161109\01\VendorConfig.xml") 
If objXMLDoc.parseError.errorCode <> 0 Then 
    MsgBox ("XML connection error detected.") 
End If 

Set Root = objXMLDoc.documentElement 
Set NodeList = Root.getElementsByTagName("Vendor") 

Dim AddVendorDetails, InputFile, FSO, oFile, strTempSourceIDs 
InputFile = "C:\users\jdarling\20161109\01\temp-4.txt" 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set oFile = FSO.OpenTextFile(InputFile) 
strTempSourceIDs = oFile.ReadAll 
oFile.Close 

Dim splitCounter 
Dim splitCatcher 
Dim IDtest 

SplitCatcher = Split(strTempSourceIDs, vbCrLf) 
For splitCounter = 0 To UBound(SplitCatcher) 
    IDtest = SplitCatcher(splitCounter) 

    For Each i In NodeList 

     'Debug.WriteLine "Comparing: " & Trim(IDtest)& " TO " & Trim(i.firstChild.nodeTypedValue) 

     If Trim(IDtest) = Trim(i.firstChild.nodeTypedValue) Then 

      Debug.WriteLine "FOUND! " & IDTest 

      Dim IDnode 
      Dim Sourcenode 
      Dim Destnode 
      Set SourceID = i.getElementsByTagName("SourceID")(0) 
      Set SourceName = i.getElementsByTagName("SourceName")(0) 
      Set DestName = i.getElementsByTagName("DestName")(0) 

      If SourceID.nodeValue <> "" Then 
       IDnode = SourceID.nodeValue 
      Else 
       IDnode = "ERROR:Undefined ID" 
      End If 
      If SourceName.nodeValue <> "" Then 
       Sourcenode = SourceName.nodeValue 
      Else 
       Sourcenode = "(No Source Name in config files)" 
      End If 
      If DestName.nodeValue <> "" Then 
       Destnode = DestName.nodeValue 
      Else 
       Destnode = "(No Dest Name in config files)" 
      End If 

      AddVendorDetails = IDnode & vbCrLf 
      AddVendorDetails = AddVendorDetails & "SourceName: " & Sourcenode & vbCrLf 
      AddVendorDetails = AddVendorDetails & "DestName: " & Destnode & vbCrLf 
      If SourceID.nodeValue <> "" Then 
       MsgBox (AddVendorDetails) 
      End If  
      strTempSourceIDs = Replace(strTempSourceIDs, IDnode, AddVendorDetails) 
     End If 
    Next 
Next 

strTempSourceIDs = "######################## " & WeekdayName(Weekday(Date)) & Date & " ########################" & vbCrLf & strTempSourceIDs 
MsgBox (strTempSourceIDs) 
+0

これはデバッグに役立つ最初のステップでしたが、半日以上の作業の後、本当の問題は ".nodeValue"ではなく ".text"を使用しなければならないことでした。また、XMLで文字列が見つからないときは何もしないので、エラーを適切に処理するために再フォーマットする必要がありました。 – Nosajimiki

1

、あなたがチェックする必要があるプロパティがtext、ないnodeValueです。また、getElement*メソッドの代わりにXPathという式でMsxml2.DOMDocumentSelectNodesを使用することをお勧めします。また、非推奨のMicrosoft.XMLDOMを使用することをお勧めします。 IDの一意性を確保するため

Set objXMLDoc = CreateObject("Msxml2.DOMDocument.6.0") 
objXMLDoc.Async = False 
objXMLDoc.Load "C:\path\to\VendorConfig.xml" 
... 
For Each node In objXMLDoc.SelectNodes("//SourceID") 
    ... 
Next 

dictionaryにファイルtemp-4.txtをロード:

For Each node In objXMLDoc.SelectNodes("//SourceID") 
    idList(Trim(node.text)) = True 
Next 

listfile = "C:\path\to\temp-4.txt" 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set idList = CreateObject("Scripting.Dictionary") 
For Each id In Split(fso.OpenTextFile(listfile).ReadAll, vbNewLine) 
    idList(Trim(id)) = True 
Next 

はあなたのXMLからのIDを持つリストを同じように更新します辞書のkeysをファイルに書き戻します。

fso.OpenTextFile(listfile, 2).Write Join(idList.Keys, vbNewLine)