2

我有以下 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 中选择行。

4

2 回答 2

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”区分大小写。

于 2012-12-19T15:00:19.157 回答
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 循环:

Dim ndRow
For Each ndRow In ndlRow
    WScript.Echo "send mail to", ndRow.getAttribute("hello")
Next
于 2012-12-19T15:12:18.060 回答