【问题标题】:How to extract data from an online API?如何从在线 API 中提取数据?
【发布时间】:2009-05-26 11:35:13
【问题描述】:

这是一个新手问题,所以请善待我:)

如何在 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 的示例,这将非常有帮助。

【问题讨论】:

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


    【解决方案1】:

    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;
    }
    

    此时,您已将 API 中的整个 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;
                }
            }
        }
    }
    

    记得检查错误,例如传递一组错误的数据,以便正确处理错误。

    :-)

    【讨论】:

    • 谢谢你解释得这么好。。在一个真正的应用程序中,如果你这样做,你会用什么(高级方法)
    • 在从我工作的公司销售的产品中,我正在使用我刚才描述的 XML 方法 :) 未来的版本可能会使用 Linq2Xml 但绝不会导致 JSON 导致我使用的 WebService 不输出 JSON,如果我有机会,我会使用它,例如,当我显示 PAGING 部分的结果网格时......像这样工作得很好而且很快,使用 LIN2XML 会快一点,但可以保存几个代码行。先选择最简单的。
    • 最后一件事..我还会使用 WebClient 类来使用 JSON 吗?
    • 取决于你在哪里调用,但通常情况下,不,你将使用 jQuery.Ajax() 方法:) 它简单而且更快;)
    【解决方案2】:

    你可以使用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
                                   };
    

    【讨论】:

    • 感谢 david..如何从返回 XML 或 JSON 的 url 获取 xmlSourceString?
    • 您可以将变量 xmlSourceString 设置为从打开 URL 并使用 balexandre 描述的 WebClient 读取流返回的 XML。
    • like: var XML = XElement.Parse(GetDocument(myPinCode));
    • 欢迎您。 XLINQ (LINQtoXML) 和任何其他 LINQ 风格的一个非常强大的方面是能够将您的查询投影到匿名类型(正如我在我的示例中所做的那样)或实际类型。我建议先使用您熟悉的 XML dom,然后再学习 LINQtoXML。
    • 有两种方法可以将 XML 加载到 LINQtoXML 中。如果您知道您将拥有一个字符串,那么您将使用 XElement.Parse 它将一个字符串作为参数。如果您有一个流,那么您将使用 XDocument.Load 而不是 XElement.Parse。
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2020-04-28
    • 2013-01-08
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多