2013-11-12 3 views
0

Я пытаюсь получить значение тега <data> ниже (это тестовое значение). Я прочитал его с XElement в приложении Windows Form. Но если я использую element.Value, я получаю строку со всеми значениями детей. Конечным XML-файлом, который нужно прочитать, является сгенерированный XML-файл. Поэтому решение должно быть динамичным. Нет фиксированных имен.XML получить значение тега без значения для детей

Результат element.Value является: This is a test value Jack22New YorkGuido21HollywoodMichael20BostonMy-Computer-1

XML файла:

<?xml version="1.0" encoding="UTF-8"?> 
<data name="data_resource" howabout="no"> 
    This is a test value 
    <persons> 
     <person> 
      <name>Jack</name> 
      <age>22</age> 
      <pob>New York</pob> 
     </person> 
     <person> 
      <name>Guido</name> 
      <age>21</age> 
      <pob>Hollywood</pob> 
     </person> 
     <person> 
      <name surname="Bats">Michael</name> 
      <age>20</age> 
      <pob>Boston</pob> 
     </person> 
    </persons> 
    <computers> 
     <computer> 
      <name>My-Computer-1</name> 
      <test> 
       <test2> 
        <test3> 
         <test4 testAttr="This is an attribute" y="68" x="132"> 
          Hatseflatsen! 
         </test4> 
        </test3> 
       </test2> 
      </test> 
     </computer> 
    </computers> 
</data> 

ли кто-нибудь имеет исправление или решение для этого, что я получаю только значение его собственной теге и не все их дети также?

+0

Что именно вы хотите сделать? Вы можете перебирать все элементы ** data * и принимать значения один за другим с помощью root.Elements («data») вместо Value. – pasty

+0

Да, но, как я уже упоминал: я использую сгенерированный XML-файл, поэтому я не знаю, что мне нужно выбрать данные. Это был пример. Мне просто нужно получить значение тега данных (не зная, что это данные). Я повторяю все элементы, поэтому я использую element.Value. Но к этому добавляются все ценности детей. Я хочу решить это. –

+0

Есть разница между 'XElement' и' XNode'. Простыми словами, узлы> теги. Каждый элемент является узлом, но не каждый узел является тегом. –

ответ

1

Это получает весь текст непосредственно в элементе, и никто из текста своих потомков:

var textValues = element.Nodes() 
         .Where(n => n.NodeType == XmlNodeType.Text) 
         .Select(n => n.ToString().Trim()); 

string value = string.Join("", textValues); // value is: This is a test value 
+0

Именно то, что я искал! Спасибо! –

0

с XPath:

XmlDocument doc = new XmlDocument(); 
doc.Load(/*The path to your xml*/); 
XmlNode root = doc.DocumentElement; 

XmlNode node = root.SelectSingleNode("/data"); 

var v = node.FirstChild; //This contains "This is a test value" 
+0

Ваша четвертая строка не нужна. 'root' уже будет помещен в элемент' data', и вы можете просто использовать его. Однако это предполагает, что желаемый текст является первым дочерним узлом элемента. – JLRishe

0

Используя Linq2Xml, попробуйте следующее:

string xmlString = //read your XML or load the file using XDocument.Load(); 
XDocument doc = XDocument.Parse(xmlString); 
System.Console.WriteLine(doc.Root.FirstNode); 

Это работает в любом случае, заменив doc.Root с целевым XElement.

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

  • Нет связанных вопросов^_^