2017-05-15 14 views
0

XMLファイルをC#オブジェクトに読み込もうとしています。 XMLには複数の子要素が含まれています。 (バージョン生き、pageidに、など)私はすべてのトップフィールドにアクセスすることができ、以下のコードを使用しても問題なく、私は子ノードの値にアクセスしようとすると、しかし、私は私があると仮定しC#子要素を持つオブジェクトにXMLをパースする

Object reference not set to an instance of an object. 

を受け取りますXMLSerializerがノードを自分のオブジェクトに一致させることができないことを示します。私は配列の上のリストフィールドのような異なるオブジェクトタイプを試しましたが、それでも同じ結果を得ているようですので、これにアプローチする最良の方法は何ですか?

正しい方向に私を指し示す助けがあれば大歓迎です。あなたのXMLを解析するXMLへ

XML

<?xml version="1.0" encoding="utf-8"?> 
    <LiveModelStruct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <version>1</version> 
    <live>true</live> 
    <pageid>1</pageid> 
    <data>test data</data> 
    <giveawayactive>false</giveawayactive> 
    <giveawayserial>00000000</giveawayserial> 
    <templates> 
    <template> 
     <id>1</id> 
     <title>Template 1</title> 
     <type>Opener</type> 
    </template> 
    <template> 
     <id>2</id> 
     <title>Template 2</title> 
     <type>Song</type> 
    </template> 
    </templates> 
</LiveModelStruct> 

オブジェクト

[XmlRoot(ElementName = "LiveModelStruct")] 
public class LiveModelStruct 
{ 
    [XmlElement(ElementName = "version")] 
    public string version { get; set; } 
    [XmlElement(ElementName = "live")] 
    public string live { get; set; } 
    [XmlElement(ElementName = "pageid")] 
    public string pageid { get; set; } 
    [XmlElement(ElementName = "data")] 
    public string data { get; set; } 
    [XmlElement(ElementName = "giveawayactive")] 
    public string giveawayactive { get; set; } 
    [XmlElement(ElementName = "giveawayserial")] 
    public string giveawayserial { get; set; } 
    [XmlElement(ElementName = "templates")] 
    public Templates Templates { get; set; } 
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsi { get; set; } 
    [XmlAttribute(AttributeName = "xsd", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsd { get; set; } 
} 

[XmlRoot(ElementName = "templates")] 
public class Templates 
{ 
    [XmlElement(ElementName = "template")] 
    public Template[] Template { get; set; }  
} 

[XmlRoot(ElementName = "template")] 
public class Template 
{ 
    [XmlElement(ElementName = "id")] 
    public string id { get; set; } 
    [XmlElement(ElementName = "title")] 
    public string title { get; set; } 
    [XmlElement(ElementName = "type")] 
    public string type { get; set; } 
} 

コード

... 
var serializer = new XmlSerializer(typeof(LiveModelStruct)); 
var data = (LiveModelStruct)serializer.Deserialize(stream); 
var test1 = data.version; 
Debug.WriteLine(test1); //Returns 1 as it should 

var test = data.Templates.Template[0].title; //Throws Error 
Debug.WriteLine(test); 
+0

私はコードに何かを見ることができないXML – Jack

+0

にLINQを使用してください。私はLinqPadにすべてを貼り付け、それを実行し、それは私に1を与え、 テンプレート1、例外はありません。 –

+0

私はここでdotnetfiddleを作った:https://dotnetfiddle.net/kDv4nFそしてそれも働く。 –

答えて

0

使用LINQ。

Parse xml using LINQ to XML to class objects

XDocument doc = XDocument.Parse(xml); 
var result = from c in doc.Descendants("LiveModelStruct") 
      select new LiveModelStruct() 
      { 
        version = (string)c.Element("version").Value, 
        live = (string)c.Element("live").Value 
      }; 
+1

これを実装しようとしていますが、構文エラーが表示されています: **クエリパターンの実装が見つかりませんでしたソースタイプ 'XDocument'の場合'選択'が見つかりません** 私はSystem.LinqとSystem.Xml.Linqへの参照を追加しました。 – logicallysynced

+0

私は上記の問題を** doc.Descendants( "LiveModelStruct")で修正しました** – logicallysynced

+0

@logicallysynced問題が解決した場合はできるだけ解決してください。 – Jack

関連する問題