à l'aide de VBscript pour extraire des données XML à partir des nœuds et des enfants
affiche la première fois ici et un peu newbie de VBscript. J'ai vraiment besoin de l'aide de vous les gars qui savent ce comme une seconde nature.
J'ai essayé d'inclure des informations pertinentes et j'espère ne pas trop.
J'ai essayé d'obtenir que cela fonctionne et je suis enfin après quelques jours de tentatives et d'une dizaine d'itérations de code. Je n'ai pas trouvé des exemples d'extraction de données à partir de plusieurs niveaux (rex et chidlren) dans le document XML.
J'ai été chargé de l'extraction de données à partir d'un fichier XML à l'aide de VBScript.
les éléments spécifiques sont les suivants: Année, Numéro de Compte, le Montant Dû, A en Souffrance? (vrai/faux) et Formaté Warrant.
Le format du fichier XML est comme ci-dessous, avec n'importe où de 1 000 à 10 000+ nœuds rempli de ces données avec beaucoup de 'divers' nœuds de là aussi bien.
<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 et FormattedWarrantNumber ne peut pas toujours être présent. par cela, je ne veux pas dire qu'ils sont vides, mais la totalité de l'entrée de CurrentAmountDue peuvent être manquants, comme indiqué ci-dessous.
<PayAmounts>
<misc5></misc5>
</PayAmounts>
J'ai besoin de l'extraire ces données à un fichier de texte séparé par des virgules. Si les données n'est pas présent, alors j'ai juste besoin d'insérer le comman, de sorte que lorsque la sortie est finalement importé dans Excel, il peut être noté pour être vide.
Le défi pour moi est de les obtenir dans les différents nœuds enfants et d'extraire les données correctement. Je n'arrive pas à sélectionner les différents nœuds correctement.
Voici quelques liens que j'ai utilisé comme référence, mais ne semble pas possible de le faire fonctionner.
http://technet.microsoft.com/en-us/magazine/2007.02.heyscriptingguy.aspx
cela semblait être la direction à suivre, mais j'obtiens une erreur "Test de Nœud Attend Ici":
Set colNodes=xmlDoc.SelectNodes("/BillData/BillHeader/*" (Year | Account | CurrentAmountDue)")
J'ai trouvé un post sur la Pile, qui a proposé d'utiliser cette technique ci-dessous, mais il ne fonctionne pas pour moi une fois que j'aurai passé deux valeurs, alors que j'ai plus. Je suppose que cela est dû à la CurrentAmountDue et FormattedWarrantNumber sont aux niveaux les plus profonds dans le XML pour ainsi dire.
strQuery = "/BillData/BillHeader/" & _
"[name()='Year' or name()='AccountNumber' or name()='HasDelinquents' or name()='CurrentAmountDue' or name()='FormattedWarrantNumber']"
À ma grande surprise, je suis en mesure d'obtenir ce retour à certaines valeurs, mais pas tous sur la même boucle donc ma sortie est désactivée (première ligne affichera seulement une année, la dernière ligne est manquante) et est juste une virgule.
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
De sorte que vous pouvez voir mes tentatives sont vaines.
J'ai aussi essayé d'insérer cette ligne ci-dessous. Je l'ai mis juste avant la PROCHAINE, mais il ne fonctionne pas comme prévu. J'ai également essayé d'insérer quelques SI-Alors déclarations pour vérifier les valeurs dans l'Année et Compte avant d'écrire le fichier, puis l'effacement de l'valeurs après l'écriture du fichier. Qui a presque fonctionné, mais ma première ligne et les dernières lignes ne sont pas productrices de données correctes.
objFileToWrite.WriteLine(strYear & "," & strAccount & "," & strCurrAmt & "," & strHasDelq & "," & strWarNum)
ok, maintenant que vous avez eu un fou rire avec mon préhistorique tentative de codage, pouvez-vous me prêter un coup de main? 🙂
laissez-moi savoir si quelque chose d'autre est nécessaire.
merci pour le temps investi. Je sais que certains d'entre vous pourraient le coup avec facilité.
Vous devez vous connecter pour publier un commentaire.
Le low-tech "modèle de conception" pour la première moitié de votre problème
la création et l'écriture d'un .CSV/.TXT fichier - est:
Dans le code:
De sortie:
S'il vous plaît marquer la différence entre
et
Un squelette pour la deuxième partie de boucle de plus structurés XML doit
ressembler à ceci
dans le code:
de sortie:
Que vous voulez placer les données de chaque BillHeader dans une ligne de la .CSV et
éléments est manquant, ne prenez pas le risque de mal mappages par l'utilisation de //ou dans d'autres types de
lâche requêtes. Juste obtenir une liste de tous "/Factures/BillData/BillHeader" et de l'exploration.
La fusion des deux scripts:
de sortie:
À résoudre votre problème, vous pouvez tisser en plus SI les clauses
comme
ou - probablement mieux dans le long terme
Définir un tableau de requêtes (dans l'ordre des champs)
Dim aQueries : aQueries = Array( _
"L'année" _
"PayAmounts/CurrentAmountDue" _
)
Réduire les recoins les plus profonds de la boucle de
Définir getData()
Vous obtenez uniquement les nœuds
Year
etHasDelinquents
, car les nœudsCurrentAmountDue
etFormattedWarrantNumber
ne sont pas immédiats, les nœuds enfants de/BillData/BillHeader
, et il n'y a pas des nœuds nommésAccountNumber
(le vrai nom de nœud seraitAcctNumber
). Pour sélectionner des nœuds à partir de n'importe où dans l'arborescence XML essayer une expression comme ceci: