如何从在线API中提取数据?

时间:2009-05-26 11:35:14

标签: asp.net linq linq-to-xml

这是一个新手问题,所以对我很好:)。

如何在ASP.NET中使用php API?此API返回XML文档。它也能够返回JSON。

输出如下所示

XML

<?xml version="1.0" encoding="UTF-8"?>

<Address>

        <Country>US</Country>

        <City>Seattle</City>

        <Result>Done</Result>

</Address>

JSON

{

"CountryCode" : "US",

"City" : "Seattle",

"Result" : "Done"

}

例如:有一个服务http://someservice.com/name_query.php?pincode=接受密码并返回XML文档。

我可以使用LINQtoXML并使用它。请使用XML和使用JSON的示例非常有用。

2 个答案:

答案 0 :(得分:6)

首先是XML与JSON

如果您打算使用API​​执行某些AJAX查询(例如,在用户单击链接/图像时查询API,例如,您想要更改该链接的颜色,则会告诉用户是不是没有...去JSON,因为你不需要解析XML)

如果你正在做“灌木丛”背后的一切,你只需要提供在后面的代码中处理的数据,那么就使用XML。

简单使用,使用WebClient对象

private string GetDocument(string myPin) {
   String url = String.Format("http://someservice.com/name_query.php?pincode={0}", myPin);

   WebClient client = new WebClient();
   client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0;)"); // pass as Internet Explorer 7.0

   Stream data = client.OpenRead(url);
   StreamReader reader = new StreamReader(data);
   s = reader.ReadToEnd();
   data.Close();
   reader.Close();

   return s;
}

目前,您拥有从字符串中获取的整个XML,您现在只需要处理XML,例如:

想象输出是一个XML文档,如:

<Hit dbId="400179221" systemId="115">
    <WorksiteDbId>200105072</WorksiteDbId>
    <Subscribed>false</Subscribed>
    <FirstName>Klaus Holse</FirstName>
    <LastName>Andersen</LastName>       
    <Status>Active</Status>
    <MainJobTitle>CEO (Managing Director, General Manager, Owner)</MainJobTitle>
    <WorksiteName>Microsoft Development Center Copenhagen ApS </WorksiteName>
    <Department></Department>
    <Address></Address>
    <Zipcode></Zipcode>
    <City></City>
    <WorksitePhone></WorksitePhone>
    <TypeCode>TY10</TypeCode>
    <WorksiteStatus>Active</WorksiteStatus>
</Hit>

处理文档信息的方法如下:

private void processDocument(string myPin) {

    String xml = GetDocument(myPin);
    XmlTextReader reader = new XmlTextReader(new StringReader(xml));
    XmlDocument document = new XmlDocument();
    document.Load(reader);

    XmlNodeList list = document.SelectNodes("/XMLNode/XMLSubNode");

    foreach (XmlNode node in list)   // loop through all nodes
    {
        foreach (XmlAttribute att in node.Attributes)  // loop through all attributes
        {
            switch (att.Name.ToLower())
            {
                case "dbid": myClass.DbID = Int32.Parse(att.InnerText); break;
                case "systemid": myClass.SystemID = Int32.Parse(att.InnerText); break;
                default: break;
            }
        }

        foreach (XmlNode subnode in node.ChildNodes)  // loop through all subnodes
        {
            switch (subnode.Name.ToLower())  // check what node has what
            {
                case "subscribed": myClass.Subscribed = bool.Parse(subnode.InnerText); break;
                case "firstname": myClass.Firstname = subnode.InnerText; break;
                case "lastname": myClass.Lastname = subnode.InnerText; break;
                case "status": myClass.Status = subnode.InnerText; break;
                ...
            }
        }
    }
}

你将myClass填满API返回的所有值......

正如你在第一行中提到的......这是新手:)这是一个很好的方式来理解获取和使用XML数据的概念......在你理解了这一部分之后,你将很容易地转向LINQ2XML:)

我希望这会有所帮助......


<强>加入

因为我现在只看到你有XML的输出,这里是使用确切XML的processDocument方法

的xml:

<?xml version="1.0" encoding="UTF-8"?>
<Address>
        <Country>US</Country>
        <City>Seattle</City>
        <Result>Done</Result>
</Address>

方法:

private void processDocument(string myPin) {

    String xml = GetDocument(myPin);
    XmlTextReader reader = new XmlTextReader(new StringReader(xml));
    XmlDocument document = new XmlDocument();
    document.Load(reader);

    XmlNodeList list = document.SelectNodes("/Address");

    foreach (XmlNode node in list)   // loop through all nodes
    {
        foreach (XmlNode subnode in node.ChildNodes)  // loop through all subnodes
        {
            switch (subnode.Name.ToLower())  // check what node has what
            {
                case "country": myClass.Country =subnode.InnerText; break;
                case "city": myClass.City= subnode.InnerText; break;
                case "result": myClass.Result = subnode.InnerText; break;
            }
        }
    }
}

请记住检查错误,例如传递错误的数据集,以便正确处理错误。

: - )

答案 1 :(得分:3)

您可以使用LINQtoXML,您可以使用XMLDom。您将使用哪种语言使用C#或VB.NET?

在LINQ to XML中执行此操作的一种方法:

var XML = XElement.Parse(xmlSourceString);
        var query = from a in XML.Descendants("addressXML")
                    select new
                               {
                                   Country = a.Element("Country").Value,
                                   City = a.Element("City").Value
                               };