2

gXMLメールを送信するページから別のページに渡される次のXMLがあります。

<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バージョン(便利なドキュメントで使用するのが最適):

  ' 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

ForEachLoopを使用できます。

Dim ndRow
For Each ndRow In ndlRow
    WScript.Echo "send mail to", ndRow.getAttribute("hello")
Next
于 2012-12-19T15:12:18.060 に答える
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 用にこのメソッドを変更します。

XPathNavigator を XML でこれに変更します。

XPathNodeIterator emailNodes = nav.Select("root/Lease/row");

XML が有効であることを確認し、「xpath」では大文字と小文字が区別されることに注意してください。

于 2012-12-19T15:00:19.157 に答える