1

ASP.NetとC#を使用してからしばらく経ちました。C#を使用してXML APIを解析しようとしていますが、サポートが必要です。私の問題は、これを行う方法がよくわからないことです。私も相反する方法を見続けています。以下のように表示されるものもあります。いくつかは、私にはずっと良く見える非常に素晴らしいクエリを示しています。

クエリの例

IEnumerable<string> partNos =
    from item in purchaseOrder.Descendants("Item")
    select (string) item.Attribute("PartNumber");

どちらの方法が優れているのでしょうか。今のところ、XMLをテキストボックスだけに解析するにはどうすればよいですか。

XML形式は次のとおりです。このXMLファイルには、スタイル情報が関連付けられていないようです。ドキュメントツリーを以下に示します。

<findItemsByKeywordsResponse xmlns="http://www.ebay.com/marketplace/search/v1/services">
<ack>Success</ack>
<version>1.12.0</version>
<timestamp>2012-06-20T22:20:33.539Z</timestamp>
<searchResult count="1">
<item>
<itemId>390432965446</itemId>
<title>
Yamaha RX-V673 7.2 Channel 90 Watt Aventage Receiver {Brand New}
</title>
<globalId>EBAY-US</globalId>
<primaryCategory>
<categoryId>14981</categoryId>
<categoryName>Home Theater Receivers</categoryName>
</primaryCategory>
<galleryURL>
http://thumbs3.ebaystatic.com/pict/3904329654464040_1.jpg
</galleryURL>
<viewItemURL>
http://www.ebay.com/itm/Yamaha-RX-V673-7-2-Channel-90-Watt-Aventage-Receiver-Brand-New-/390432965446?pt=Receivers_Tuners
</viewItemURL>
<productId type="ReferenceID">114468754</productId>
<paymentMethod>PayPal</paymentMethod>
<autoPay>false</autoPay>
<postalCode>54143</postalCode>
<location>Marinette,WI,USA</location>
<country>US</country>
<shippingInfo>
<shippingServiceCost currencyId="USD">0.0</shippingServiceCost>
<shippingType>Free</shippingType>
<shipToLocations>US</shipToLocations>
<expeditedShipping>false</expeditedShipping>
<oneDayShippingAvailable>false</oneDayShippingAvailable>
<handlingTime>2</handlingTime>
</shippingInfo>
<sellingStatus>
<currentPrice currencyId="USD">519.0</currentPrice>
<convertedCurrentPrice currencyId="USD">519.0</convertedCurrentPrice>
<sellingState>Active</sellingState>
<timeLeft>P28DT23H32M35S</timeLeft>
</sellingStatus>
<listingInfo>
<bestOfferEnabled>false</bestOfferEnabled>
<buyItNowAvailable>false</buyItNowAvailable>
<startTime>2012-06-19T21:48:08.000Z</startTime>
<endTime>2012-07-19T21:53:08.000Z</endTime>
<listingType>StoreInventory</listingType>
<gift>false</gift>
</listingInfo>
<returnsAccepted>true</returnsAccepted>
<condition>
<conditionId>1000</conditionId>
<conditionDisplayName>New</conditionDisplayName>
</condition>
<isMultiVariationListing>false</isMultiVariationListing>
</item>
</searchResult>
<paginationOutput>
<pageNumber>1</pageNumber>
<entriesPerPage>1</entriesPerPage>
<totalPages>1121495</totalPages>
<totalEntries>1121495</totalEntries>
</paginationOutput>
<itemSearchURL>
http://www.ebay.com/sch/i.html?_nkw=yamaha&_ddo=1&_ipg=1&_pgn=1
</itemSearchURL>
</findItemsByKeywordsResponse>

私のC#コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;

namespace ebayLinq
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string myAppID = "hidden from stack overflow";
            string ebayUrl = "http://svcs.ebay.com/services/search/FindingService/v1?";
            string operationName = "OPERATION-NAME=getSearchKeywordsRecommendation&";
            string serviceVersion = "SERVICE-VERSION=1.11.0&";
            string securityAppName = "SECURITY-APPNAME="+ myAppID +"&";
            string responseData = "RESPONSE-DATA-FORMAT=XML&";
            string rest = "REST-PAYLOAD&";

            string searchString = "macbook Pro";
            string keywords ="keywords="+searchString+"&";


            var xml = XDocument.Load(ebayUrl + 
                                        operationName + 
                                        serviceVersion + 
                                        securityAppName + 
                                        responseData);

            //XNamespace ns = "http://www.ebay.com/marketplace/search/v1/services";
            //XElement ack = xml.Root.Element(ns + "ack");    
        }
    }
}

できる限り、上記のコードで動作させることができますが、これまでのところ、ackよりも深くする方法がわかりません。また、上記で使用した方法ではなく、クエリを実行したいと思います。

入力友達はいますか?

あなたの入力で私はこれを思いついたが、それは正しく機能しませんか?

   XElement convertedCurrentPrice = (from x in xml.Root.Descendants("title") select x).FirstOrDefault();
                string item = Convert.ToString(convertedCurrentPrice);
                TextBox1.Text = item;
4

2 に答える 2

1

私はXMLを解析する古い方法に個人的には精通していませんが、新しいLINQ to XMLのものはあなたが話しているクエリスタイルであり、XDocumentから情報を引き出すことに関しては間違いなく迅速かつ簡単になります。

特にデータをプルしたい1つ以上のノードの例を教えていただければ、それをお手伝いできますが、基本的な構造は次のようになります(たとえば、現在の価格値519.0を取得したい場合)

XElement convertedCurrentPrice = (from x in xml.Root.Descendants("convertedCurrentPrice") select x).FirstOrDefault();

これにより、XMLノード全体(との間のすべて)が返されます。

次に、値を取得するのは次のように簡単です。

double price = Convert.ToDecimal(convertedCurrentPrice.Value);
于 2012-06-20T22:43:29.967 に答える
1

どちらの構文が優れているかを答えるのは難しいです。参考までに、これらはクエリ構文およびメソッド構文と呼ばれます。これは、違いに関するMSDNの記事です(この記事では、読みやすさのためにクエリ構文を推奨しています)。それらはほぼ同等であり、私は両方を頻繁に使用します。

詳細については、このトピックについて説明しているSOの質問を参照してください。

于 2012-06-20T22:40:23.023 に答える