2014-02-01 2 views
0

У меня есть XML-файл этого типакак прочитать конкретный XML-элемент в Windows 8 платформы

<HolyQuran TranslationID="103" Writer="Maulana Mohammad Ali" Language="English" LanguageIsoCode="eng" Direction="ltr"> 
<Chapter ChapterID="1" ChapterName="The Opening"> 
    <Verse VerseID="1"><![CDATA[In the name of Allah, the Beneficent, the Merciful.]]></Verse> 
    <Verse VerseID="2"><![CDATA[Praise be to Allah, the Lord of the worlds,]]></Verse> 
    <Verse VerseID="3"><![CDATA[The Beneficent, the Merciful,]]></Verse> 
    <Verse VerseID="4"><![CDATA[Master of the day of Requital.]]></Verse> 
    <Verse VerseID="5"><![CDATA[Thee do we serve and Thee do we beseech for help.]]></Verse> 
    <Verse VerseID="6"><![CDATA[Guide us on the right path,]]></Verse> 
    <Verse VerseID="7"><![CDATA[The path of those upon whom Thou has bestowed favours, Not those upon whom wrath is brought down, nor those who go astray.]]></Verse> 
</Chapter> 

, что я хочу, чтобы прочитать конкретный стих секции CDATA. Например, если я прохожу Глава идентификатор и идентификатор Verse к функции, поэтому он должен возвращать конкретный CDATA содержание

я попробовал этот блок кода

public string getTranslation(int p1, int p2) 
    { 
     string translationPath = Path.Combine(Package.Current.InstalledLocation.Path, "Data/eglish-translation.xml"); 
     XDocument document = XDocument.Load(translationPath); 
     var value = (from r in document.Descendants("Chapter").Where 
            (r => ((int)r.Attribute("ChapterID") == p1)&&(int)r.Attribute("VerseId") == p2)) 
       select r.Element("Verse").Value).FirstOrDefault(); 


      return value; 
    } 

Но его возвращение нулевой, что я делаю неправильно здесь?

ответ

0

VerseId является атрибутом Verse элемент, а не Chapter элемент. Вот правильный запрос:

var value = (from c in document.Descendants("Chapter") 
      where (int)c.Attribute("ChapterID") == p1 
      from v in c.Elements("Verse") 
      where (int)v.Attribute("VerseID") == p2 
      select (string)v).FirstOrDefault(); 

Или с синтаксисом лямбды:

var value = document.Descendants("Chapter") 
        .Where(c => (int)c.Attribute("ChapterID") == p1) 
        .SelectMany(c => c.Elements("Verse")) 
        .Where(v => (int)v.Attribute("VerseID") == p2) 
        .Select(v => (string)v) 
        .FirstOrDefault(); 

Примечания стороны - если HolyQuran является корневым элементом вашего файла XML, то лучше запросить главы document.Root.Elements() или document.Root.Elements("Chapter"), чтобы избежать пересекая целую деревню для потомков.

Вы можете также использовать XPath:

var xpath = 
    String.Format("//Chapter[@ChapterID='{0}']/Verse[@VerseID='{1}']", p1, p2); 
var value = (string)document.XPathSelectElement(xpath); 
+0

на самом деле я картографирование его против другого XML-файл, в котором я прочитал Священный Коран на арабском языке и загрузил данные, но когда я интегрировать этот код и использовать возвращаемое значение быть использованным в шаблоне шаблона элемента, когда-либо просто исчезает даже не в другом файле, который отлично работает без него – user3149814

+0

@ user3149814 код выше работает с xml, который вы предоставили –

+0

thanx alot это работает сейчас немного медленно, но снова работает спасибо – user3149814

Смежные вопросы