2009-05-01 9 views
2

私は以下のxmlファイルを持っており、要素(CDATAに埋め込まれています)の値を取得する方法がわからないようです。私はlinqをxmlに使用しようとしています。誰かがこれを "Product"オブジェクトに変換する方法を知っている場合(要素と同じ名前のプロパティを持つ製品オブジェクトがあると仮定します)。前もって感謝します。私は上のマシンにアクセス全くないxmlにlinqを使ってCDATAを読み取る

XElement cnetResponse = XElement.Parse(rawXml); 

IEnumerable<NameQty> products = 
    from e in cnetResponse.Descendants("TechProduct") 
    select new Product(
     (string)e.Element("Name"), 
     (int)e.Element("Topic").Attribute("id"), 
     (string)e.Element("ImageURL") 
    ); 

foreach(Product p in products) 
{ 
    // do stuff 
} 

rawXmlはCNET応答XMLであるところ、これを試してみてください、あなたのProductクラスは、ここで使用コンストラクタを持っていると仮定すると

ボブ

<CNETResponse realm="cnet" version="1.0" xmlns="http://api.cnet.com/rest/v1.0/ns" xmlns:xlink="http://www.w3.org/1999/xlink"> 
<TechProduct id="33517677"> 
    <Name><![CDATA[Nikon CoolPix L20 (deep red)]]></Name> 
    <Topic id="1670"></Topic> 
    <ImageURL width="60"><![CDATA[http://i.i.com.com/cnwk.1d/sc/33517677-2-60-0.gif]]></ImageURL> 
</TechProduct> 
</CNETResponse> 

答えて

2

問題は名前空間である - 例えば、何かのように:

XNamespace ns = "http://api.cnet.com/rest/v1.0/ns"; 
XElement techProd = doc.Root.Element(ns + "TechProduct"); 

Product product = new Product { 
    Id = (int)techProd.Attribute("id"), 
    Name = techProd.Element(ns + "Name").Value, 
    Topic = techProd.Element(ns + "Topic").Value, 
    TopicId = (int)techProd.Element(ns + "Topic").Attribute("id"), 
    ImageUrl = techProd.Element(ns + "ImageURL").Value, 
    ImageWidth = (int)techProd.Element(ns + "ImageURL").Attribute("width"), 
}; 

あなたはまたXmlSerializerを好むかもしれない - のようなもの:

[Serializable, XmlRoot("CNETResponse", Namespace = CnetResponse.Namespace)] 
public class CnetResponse { 
    public const string Namespace = "http://api.cnet.com/rest/v1.0/ns"; 
    public TechProduct TechProduct { get; set; } 
} 
[Serializable, XmlType(Namespace = CnetResponse.Namespace)] 
public class TechProduct 
{ 
    [XmlAttribute("id")] 
    public int Id { get; set; } 
    public string Name {get;set;} 
    public Topic Topic { get; set; } 
    [XmlElement("ImageURL")] 
    public Image Image { get; set; }   
} 
[Serializable, XmlType(Namespace = CnetResponse.Namespace)] 
public class Topic { 
    [XmlAttribute("id")] 
    public int Id { get; set; } 
    [XmlText] 
    public string Text {get;set;} 
} 
[Serializable, XmlType(Namespace = CnetResponse.Namespace)] 
public class Image { 
    [XmlAttribute("width")] 
    public int Width { get; set; } 
    [XmlText] 
    public string Url {get;set;} 
} 
:のようなクラス定義で

XmlSerializer ser = new XmlSerializer(typeof(CnetResponse)); 
CnetResponse response = (CnetResponse)ser.Deserialize(new StringReader(xml)); 
TechProduct product = response.TechProduct; 

あるいは、xmlをxsd.exeまで実行してC#コードをスーツ:

xsd foo.xml 
xsd foo.xsd /classes 
+0

これはまさに私の問題です。私にこれを手伝ってくれてありがとう、私はこの問題に完全に戸惑いました。 – Beaker

1

これをテストするために、私は保証をしません。

関連する問題