2013-01-16 59 views
0

我想讀的XML文件,我把它寫在這裏在XML元素總是空值

<?xml version="1.0" encoding="utf-8"?> 
<ReyPatch> 

    <Key name="{8880-089B7A97D4B7}" new="true"> 
    <Value name="" type="string" patchedValue="5lpha" /> 
    <Value name="LayID" type="dword" patchedValue="2" /> 
    <Value name="Usons" type="dword" patchedValue="1" /> 
    <Value name="IsBaition" type="dword" patchedValue="0" /> 
    <Value key="key" name="Type" type="dword" patchedValue="2036" /> 
<Value key="KeyHars" name="Count" type="dword" patchedValue="0" /> 
    </Key> 
<Key name="BBBE-A957C7628109}" new="true"> 
    <Value name="" type="string" patchedValue="4pha" /> 
    <Value name="LayD" type="dword" patchedValue="2" /> 
    <Value name="Utons" type="dword" patchedValue="1" /> 
    <Value name="IsBfinition" type="dword" patchedValue="0" /> 
    <Value key="Keys\0" name="Type" type="dword" patchedValue="2807" /> 
    <Value key="Keys\0" name="Text" type="string" patchedValue="2" /> 
    <Value key="Keys\1" name="Type" type="dword" patchedValue="2097" /> 
    <Value key="Keers" name="Count" type="dword" patchedValue="0" /> 
    </Key> 
</ReyPatch> 

我寫了這個代碼,但總是有NullReferenceException異常

Uri url = new Uri("p.xml", UriKind.Relative); 
      StreamResourceInfo resourceStream = Application.GetResourceStream(url); 
      var doc = XDocument.Load(resourceStream.Stream); 
      var newCookies = doc 
      .Descendants() 
      .Select(e => 
       new Key 
       { 
        name = e.Element("name").ToString(), 
        IsNew =Convert.ToBoolean(e.Element("new").Value), 
        v = e. 
        Elements("Value").Select(i => 

         new Value 
         { 
          name = i.Element("name").Value, 
          type = i.Element("type").Value, 
          patchedValue = i.Element("patchedValue").Value 
         }).ToArray() 
       }).ToArray(); 
     } 

我測試所有的方式並且我沒有找到任何方法去做 我該如何解決這個問題?

+2

您正在尋找不存在的元素。您應該查看屬性。 – juharr

回答

1

name,new,typepatchedValue是屬性而不是元素。您需要使用Attribute方法而不是Element。並防止NullReferenceException時屬性丟失,你應該只投的特性,將string而不是使用ToStringValue

 .Select(e => 
      new Key 
      { 
       name = (string)e.Attribute("name"), 
       IsNew =Convert.ToBoolean((string)e.Attribute("new")), 
       v = e. 
       Elements("Value").Select(i => 

        new Value 
        { 
         name = (string)i.Attribute("name"), 
         type = (string)i.Attribute("type"), 
         patchedValue = (string)i.Attribute("patchedValue") 
        }).ToArray() 
      }).ToArray(); 
+0

一半的工作,但沒有全部 當我評論 名= e.Attribute( 「名」)。toString()方法, 是否新款= Convert.ToBoolean(e.Attribute( 「新」)。值), 所有事情工作,但當我取消註釋,我再次有NullReferenceException :( –

0

你得到異常,因爲你得到你的XML的所有後代。你應該使用.Descendants("Key")。否則,將被選擇的第一個元素是<ReyPatch>元素,它沒有元素<name>,並且您在e.Element("name").ToString()上得到了例外。

@juharr是正確的,你試圖獲取元素而不是屬性。見差異XML Elements vs. Attributes

全解析應該像(我強烈建議您使用節點的鑄造,而不是讓他們的價值觀):

doc.Descendants("Key") 
    .Select(key => new Key() 
    { 
     name = (string)key.Attribute("name"), 
     IsNew = (bool)key.Attribute("new"), 
     v = key.Elements() 
       .Select(value => new Value() 
       { 
        name = (string)value.Attribute("name"), 
        type = (string)value.Attribute("type"), 
        patchedValue = (string)value.Attribute("patchedValue") 
       }).ToArray() 
    }).ToArray(); 

我建議你使用PascalCase房產命名和更具描述性。例如。

public class Key 
{ 
    public string Name { get; set; } 
    public bool IsNew { get; set; } 
    public Value[] Values { get; set; } 
} 
+0

謝謝這項工作:) –