2015-10-09 5 views
0

Мне нужно выбрать данные из xml в C#. Структура XML имеет следующий вид:Запрос LINQ к XML в C#

<?xml version="1.0"?> 
<xdoc version=""...> 
    <something> 
     ... 
    </something> 
    <fields> 
     <field dimensions="" name="something else"> 
      <ff>x</ff> 
      <text>something</text> 
      <gg>x</gg> 
     </field> 
     <field dimensions="" name="SUPPLIER_NAME"> 
      <ff>x</ff> 
      <text>This is what I want</text> 
      <gg>x</gg> 
     </field> 
     <field dimensions="" name="something else2"> 
      <ff>x</ff> 
      <text>something2</text> 
      <gg>x</gg> 
     </field> 
    </fields> 
    <something2> 
     ... 
    </something2> 
</xdc> 

Код запрос следующий:

XElement root = XElement.Load(path); 
IEnumerable<XElement> hodnota = from el in root.Elements("fields") 
           where (string)el.Attribute("name") == "SUPPLIER_NAME" 
           select el; 


foreach (XElement in hodnota) 
    textBox1.Text += (string)el.Atribute("text") + Environment.NewLine; 

Цель заключается в выбор текста «Это то, что я хочу» от элемента, где имя атрибута является «поставщиком». Затем отправьте его в excel, эта часть работает безупречно, но я не могу найти правильное выражение, поэтому я пишу в текстовое поле для более быстрого тестирования. Я попытался выбрать строку xml, но безуспешно, так что это так.

Может кто-нибудь, пожалуйста, посмотрите на предоставленный код и скажите мне, что я делаю неправильно?

Спасибо, Andrew

+1

Из 'TextBox1.Text + = (строка) el.Atribute ("текст") + Environment.NewLine' в' TextBox1.Text + = el.Element («текст»). Value + Environment.NewLine'? –

ответ

1

Учитывая правильную структуру XML, это дает мне желаемый результат.

string content = File.ReadAllText(@"C:\YourFolder\Yourfile.xml"); 
XDocument xDoc = XDocument.Parse(content); 

var supplierNameField = xDoc.Descendants("field").First(d => d.Attribute("name").Value == "SUPPLIER_NAME"); 
var text = supplierNameField.Element("text").Value; 
0

Используйте Наследники

  XDocument doc = XDocument.Load(FILENAME); 
      List<XElement> hodnota = doc.Descendants("field").Where(el => el.Attribute("name").Value == "SUPPLIER_NAME").ToList();​ 
1

Ваш вопрос о том, что атрибуты находятся под поля и не полями. Вот пример, который должен работать

IEnumerable<XElement> hodnota = from el in root.Elements("fields").Elements("field") 
            where (string)el.Attribute("name") == "SUPPLIER_NAME" 
            select el; 


    foreach (XElement el in hodnota) 
     Console.WriteLine(el.Element("text").Value); 

или просто

IEnumerable<string> hodnota = from el in root.Elements("fields").Elements("field") 
            where (string)el.Attribute("name") == "SUPPLIER_NAME" 
            select el.Element("text").Value; 


    foreach (string el in hodnota) 
     Console.WriteLine(el);