การแยกวิเคราะห์ XML ใน Windows Phone 8 C#

ฉันต้องการแยกไฟล์ xml จาก URL ต่อไปนี้:"http://restservice.com/RestServiceImpl.svc/ghhf/cvr"

ฉันสามารถรับ XDocument ได้โดยใช้รหัสต่อไปนี้:

private void Search(object sender, RoutedEventArgs e)
{
    string url = "http://restservice.schoolpundit.com/RestServiceImpl.svc/search_name/cvr";
    WebClient twitter = new WebClient();
    twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
    twitter.DownloadStringAsync(new Uri(url));
}

void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null)
        return;
    XDocument doc = XDocument .Parse(e.Result);

    var list = from child in  doc.Descendants("Institutions_search_name")
               select new listrows {
                  inst_name=doc.Element("Inst_name").Value;
               };

     Listbox.ItemSource=list;
} 

แต่มันไม่แสดง Inst_name ใดๆ จริงๆ แล้วมันไม่ได้เข้าไปใน doc.Descendants("Institutions_search_name") มันไม่แสดงข้อยกเว้นใดๆ เช่นกัน หากฉันทำผิดพลาด โปรดแก้ไขให้ถูกต้องด้วย


person madan V    schedule 08.05.2013    source แหล่งที่มา
comment
รหัสของคุณไม่ได้ ใช้ list ที่ใดก็ได้... แต่ควรจะจบลงด้วยการใช้วิธี doc.Descendants แต่คุณไม่ได้ทำอะไรกับผลลัพธ์ คุณได้ตรวจสอบในดีบักเกอร์ว่าการแยกวิเคราะห์สำเร็จหรือไม่ โปรดทราบว่าโค้ดปัจจุบันของคุณจะไม่คอมไพล์เมื่อคุณพยายามใช้คุณสมบัติชื่อ value เมื่อคุณสมบัติจริงเรียกว่า Value ไม่มีประโยชน์ที่จะให้โค้ดของคุณเหมือนกับโค้ดของคุณ คุณควรให้โค้ด จริง แก่เราเพื่อแสดงให้เห็นถึงปัญหา   -  person Jon Skeet    schedule 08.05.2013
comment
ฉันต้องการผูกรายการนั้นกับกล่องรายการ ฉันแก้ไขคำถามแล้ว ตรวจสอบตอนนี้และบอกวิธีแยกวิเคราะห์ xml ให้ฉันด้วย   -  person madan V    schedule 08.05.2013
comment
คุณยังไม่ได้บอกว่าคุณได้ตรวจสอบในดีบักเกอร์แล้วว่าการเรียก XDocument.Parse ทำงานหรือไม่ (และโค้ดในคำถามของคุณมีรูปแบบที่ น่ากลัว โปรดใช้ความพยายามเล็กน้อยเพื่อทำให้สามารถอ่านได้ โดยมีการเยื้องสม่ำเสมอ และไม่มีช่องว่างในแนวตั้งจำนวนมากโดยไม่มีเหตุผล)   -  person Jon Skeet    schedule 08.05.2013
comment
รหัสที่คุณนำเสนอยังคงไม่สามารถคอมไพล์ได้เนื่องจาก ; หลัง Value คุณควรจะมีตัวอย่างสั้นๆ แต่ครบถ้วน ซึ่งคุณสามารถโพสต์ คำต่อคำ ก่อนที่จะถามคำถาม   -  person Jon Skeet    schedule 08.05.2013


คำตอบ (1)


ฉันคิดว่าคุณแค่ขาดเนมสเปซ - แม้ว่าคุณจะโทรหา doc.Element แทนที่จะเป็น child.Element ก็ตาม หากคุณดูที่ XML คุณจะเห็นสิ่งนี้ในองค์ประกอบรูท:

 xmlns="http://schemas.datacontract.org/2004/07/RestService"

นั่นหมายความว่าทุกองค์ประกอบที่ไม่ได้ระบุเนมสเปซอย่างชัดเจนจะอยู่ในเนมสเปซนั้น

โชคดีที่ LINQ to XML ทำให้การจัดการนี้ง่ายมาก:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = from child in doc.Descendants(ns + "Institutions_search_name")
           select new listrows {
               inst_name=child.Element(ns + "Inst_name").Value
           };

แม้ว่าฉันอาจจะทำโดยไม่มีนิพจน์แบบสอบถาม:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = doc.Descendants(ns + "Institutions_search_name")
              .Select(x => new listrows { 
                         inst_name = child.Element(ns + "Inst_name").Value
                      });

ที่จริงแล้ว เนื่องจากคุณ เพียง เลือกสตริงเดียว ฉันจะกำจัด listrows บิตออก:

XNamespace ns = "http://schemas.datacontract.org/2004/07/RestService";
var list = doc.Descendants(ns + "Institutions_search_name")
              .Select(x => child.Element(ns + "Inst_name").Value);

โปรดทราบว่าทั้ง listrows และ inst_name ฝ่าฝืนหลักเกณฑ์การตั้งชื่อ .NET จึงควรพยายามให้สอดคล้องกับหลักเกณฑ์เหล่านั้นเพื่อทำให้โค้ดของคุณอ่านง่ายขึ้นสำหรับทุกคน

person Jon Skeet    schedule 08.05.2013
comment
ฉันได้รับ NullReference Exception ใน inst_name=child.Element(ns + Inst_name).Value แต่มีข้อความอยู่ใน inst_name - person madan V; 08.05.2013