我有以下XML,gXML
从一个页面传递到另一个发送电子邮件的页面。
<root>
<Lease>
<row hello="none@nowhere.com">
<row hello="none@nowhere.com">
<row hello="none@nowhere.com">
<row hello="none@nowhere.com">
</Lease>
</root>
我希望能够向每一行发送电子邮件,我希望它像这样:
for (each row){
blah blah blah (send email function)
}
如何选择XML中的行。
答案 0 :(得分:2)
如果您使用的是VBScript,我假设您可以访问System.Xml。
在这个页面上看看: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.childnodes.aspx
在Google上挖掘一下,特别是看看使用System.Xml.XPath。那里有很多例子。
这是我在用于测试的控制台应用程序中编写的测试方法。它是用C#编写的,但这个想法应该有所帮助:
private static void ExtractUserNodeFromUsersXml()
{
XmlDocument xmlDoc = new XmlDocument();
string xml = @"<data xmlns=''><users><user id='33' culture='en-gb' />
<user id='38 culture='en-gb' />
<user id='285'culture='en-gb' /></users></data>";
xmlDoc.LoadXml(xml);
string userid = "38";
XPathNavigator nav = xmlDoc.CreateNavigator();
XPathNodeIterator userNodes = nav.Select("data/users/user[@id='" + userGuid + "']");
while (userNodes.MoveNext())
{
if (userNodes.Current is IHasXmlNode)
{
XmlNode node = ((IHasXmlNode)userNodes.Current).GetNode();
if (node != null)
{
string culture = node.Attributes.GetNamedItem("culture").Value;
Console.WriteLine(node.OuterXml);
Console.WriteLine("Culture is " + culture);
}
}
}
Console.WriteLine();
Console.WriteLine("******");
Console.WriteLine();
Console.WriteLine(xmlDoc.OuterXml);
}
对于你需要的东西可能有点过分,但是如果你在线看并使用这个代码来玩,那么它会有所帮助。实际上,我现在就为你的XML改变这种方法。
使用您的XML更改XPathNavigator。
XPathNodeIterator emailNodes = nav.Select("root/Lease/row");
确保您的XML有效并记住'xpath'区分大小写。
答案 1 :(得分:2)
VBScript版本(最适合Docs使用):
' Assuming you have a string in gXML, I fake it here, please
' note the closing of the row nodes!
Dim gXML : gXML = Join(Array( _
"<root>" _
, " <Lease>" _
, " <row hello=""none@nowhere.com""/>" _
, " <row hello=""none@nowhere.com""/>" _
, " <row hello=""none@nowhere.com""/>" _
, " <row hello=""none@nowhere.com""/>" _
, " </Lease>" _
, "</root>" _
), "")
Dim oXML : Set oXML = CreateObject("Msxml2.DOMDocument")
oXML.loadXml gXML
If 0 = oXML.ParseError Then
Dim ndlRow : Set ndlRow = oXML.selectNodes("/root/Lease/row")
If 0 < ndlRow.length Then
Dim nRow
For nRow = 0 To (ndlRow.length - 1)
WScript.Echo nRow, "send mail to", ndlRow(nRow).getAttribute("hello")
Next
Else
WScript.Echo "no rows found"
End If
Else
WScript.Echo oXML.parseError.reason
End If
输出:
0 send mail to none@nowhere.com
1 send mail to none@nowhere.com
2 send mail to none@nowhere.com
3 send mail to none@nowhere.com
而不是计数循环
For nRow = 0 To (ndlRow.length - 1)
WScript.Echo nRow, "send mail to", ndlRow(nRow).getAttribute("hello")
Next
你可以使用For Each Loop:
Dim ndRow
For Each ndRow In ndlRow
WScript.Echo "send mail to", ndRow.getAttribute("hello")
Next