2011-06-07 82 views
0

我堅持下面的XML問題。 這是我的XML文件:Silverlight 4.0閱讀複雜的XML與LINQ

<POIs lastUsedId="9000010"> 
<POI id="9000010" name="München"><Latitude>48.139126</Latitude><Longitude>11.5801863</Longitude> 
<Address>muenchen</Address><PhotoDescription>Hofbräuhaus</PhotoDescription> 
<Photos directory="_x002F_pics"><PhotoFile>pic4poi_9000010-01.jpg</PhotoFile> 
<PhotoFile>pic4poi_9000010-02.jpg</PhotoFile><PhotoFile>pic4poi_9000010-03.jpg</PhotoFile> 
<PhotoFile>pic4poi_9000010-04.jpg</PhotoFile></Photos> 
<InformationFile>infos\info4poi_9000010.txt</InformationFile></POI> 
</POIs> 

,這裏是我的代碼來讀取文件:

XDocument doc = XDocument.Load(s); 
       lastID = Int32.Parse(doc.Root.Attribute("lastUsedId").Value.ToString()); 
       CultureInfo cultureInfo = new CultureInfo("en-GB"); 
       var pois = from res in doc.Descendants("POI") 
          select new 
          { 
           id = Int32.Parse(res.Attribute("id").Value.ToString()), 
           name = res.Attribute("name").Value.ToString(), 
           latitude = Double.Parse(res.Element("Latitude").Value, cultureInfo), 
           longitude = Double.Parse(res.Element("Longitude").Value, cultureInfo), 
           address = res.Element("Address").Value.ToString(), 
           photoDesc = res.Element("PhotoDescription").Value.ToString(), 
           photoDir = XmlConvert.DecodeName(res.Element("Photos").Attribute("directory").Value.ToString()), 
           photoFiles = from a in doc.Descendants("Photos") 
              select new 
              { 
               photo = a.Element("PhotoFile").Value.ToString() 
              }, 
           info = res.Element("InformationFile").Value.ToString() 
          }; 
       foreach (var poi in pois) 
       { 
        IEnumerable<string> pF = (poi.photoFiles as IEnumerable<string>); 
        List<string> photoFiles = null; 
        if(pF != null) 
         photoFiles = pF.ToList<string>(); 
        AddPushpin(poi.id, poi.name, poi.latitude, poi.longitude, poi.address, poi.photoDesc, poi.photoDir, photoFiles, poi.info); 
       }; 

我不確定與PhotoFiles的一部分,因爲我得到一個不明物體錯誤,當我嘗試閱讀圖釘。 這是我的圖釘的樣子:

public class MyPushpin : Pushpin 
{ 
    public int ID { get; set; } 
    public string Address { get; set; } 
    public string PhotoDesc { get; set; } 
    public string PhotoDir { get; set; }   
    public List<string> PhotoFiles { get; set; } 

    public MyPushpin() { } 

    public MyPushpin(int id, string name, double latitude, double longitude, string address, string photoDesc, string photoDir, List<string> photoFiles, string info) 
    { 
     Location loc = new Location(latitude, longitude); 
     this.ID = id; 
     this.Location = loc; 
     this.Name = name; 
     this.Address = address; 
     this.PhotoDesc = photoDesc; 
     this.PhotoDir = photoDir; 
     this.PhotoFiles = photoFiles; 
     this.Tag = info; 
    } 

    public void Update(string name , string photoDesc, List<string> photoFiles, string info) 
    { 
     this.Name = name; 
     this.PhotoDesc = photoDesc; 
     this.PhotoFiles = photoFiles; 
     this.Tag = info; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0} - {1}", this.ID, this.Location, this.Address, this.PhotoDesc, this.PhotoDir, this.Tag); 
    } 

這就是我想用自定義圖釘文件信息代碼:

public partial class Gallery : ChildWindow 
{ 
    List<string> pics = null; 
    public Gallery(MyPushpin currentPin) 
    { 
     InitializeComponent(); 
     pics = currentPin.PhotoFiles; 
     Loaded += (a, b) => { 
      LoadImages(); 
     }; 
    } 

    private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
     Close(); 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = false; 
     Close(); 
    } 

    private void LoadImages() 
    { 
     List<Picture> coll = new List<Picture>(); 
     pics.ForEach(delegate(String url) 
     { 
      coll.Add(AddPicture("url")); 
     }); 
     //coll.Add(AddPicture("/pics/pic4poi_9000010-01.jpg")); 
     //coll.Add(AddPicture("/pics/pic4poi_9000010-02.jpg")); 
     //coll.Add(AddPicture("/pics/pic4poi_9000010-03.jpg")); 
     //coll.Add(AddPicture("/pics/pic4poi_9000010-04.jpg")); 

     Preview.Source = new BitmapImage(
      new Uri(
       "/pics/pic4poi_9000010-01.jpg", 
       UriKind.Relative)); 
     lbImage.ItemsSource = coll; 
    } 

    private Picture AddPicture(string path) 
    { 
     return new Picture 
     { 
      Href = new BitmapImage(
      new Uri(
       path, 
       UriKind.Relative)) 
     }; 
    } 

    private void lbImage_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     Preview.Source = ((Picture)lbImage.SelectedItem).Href; 
    } 
} 
public class Picture 
{ 
    public ImageSource Href { get; set; } 

THX您的時間 洲

回答

0

您能否詳細描述您所遇到的問題。你是否調試過它,它在哪裏失敗,什麼是異常?你期望它做什麼。

關閉我的頭頂,這個代碼看起來錯誤:

photoFiles = from a in doc.Descendants("Photos") 
              select new 
              { 
               photo = a.Element("PhotoFile").Value.ToString() 
              }, 

替換文檔與資源,因爲你想要的當前元素的子元素,文檔的不行。你也可以在這裏使用元素而不是後代,因爲它們是直接的孩子。此外,由於有多個照片文件,請嘗試一個SelectMany(從a ... from b ...):

photoFiles = from a in res.Elements("Photos") 
      from b in a.Elements("PhotoFile") 
              select new 
              { 
               photo = b.Value.ToString() 
              }, 
+0

我正在嘗試讀取MyPushpin對象的圖像的URL,當用戶單擊在圖釘上的位置處顯示的圖釘圖像顯示在窗口中。 – 2011-06-07 17:20:29

+0

嗨, 我找到了錯誤。這是我嘗試從XML檢索PhotoFiles的部分。我已經嘗試了您的建議,但返回的列表仍爲空。 – 2011-06-07 19:24:29

+0

我修改查詢以這樣的: photoFiles = res.Elements( 「照片」) 。選擇(X => x.Value) .ToList(), 根據這個線程:[鏈接]( http://stackoverflow.com/questions/5012186/reading-xml-data-using-linq-multiple-elements-with-the-same-name) 現在我得到PhotoFile字符串,但沒有分開。 第一個List元素的內容如下所示: pic4poi_9000010-01.jpgpic4poi_9000010-02.jpgpic4poi_9000010-03.jpgpic4poi_9000010-04.jpg 如何區分它們? – 2011-06-07 21:31:42