2010-06-03 2 views
11

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

<TimelineInfo> 
    <PreTrialEd>Not Started</PreTrialEd> 
    <Ambassador>Problem</Ambassador> 
    <PsychEval>Completed</PsychEval> 
    </TimelineInfo> 

И все, что я хочу сделать, это использовать C#, чтобы строка хранится между <Ambassador> и </Ambassador>.

До сих пор у меня есть:

XmlDocument doc = new XmlDocument(); 
doc.Load("C:\\test.xml"); 
XmlNode x = doc.SelectSingleNode("/TimelineInfo/Ambassador"); 

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

ответ

15

Могу ли я предложить взглянуть на LINQ-to-XML (System.Xml.Linq)?

var doc = XDocument.Load("C:\\test.xml"); 

string result = (string)doc.Root.Element("Ambassador"); 

LINQ к XML является гораздо более дружелюбным, чем Xml * классов (System.Xml).


В противном случае вы должны быть в состоянии получить значение элемента путем извлечения InnerText свойства.

string result = x.InnerText; 
+0

Вы не должны бросить в XmlElement - InnerText определяется в родительском XmlNode как виртуальном, а XmlElement просто переопределяет его, как обычно. –

+1

BTW, в случае, если другие сталкиваются с этим - важна листинг для строки (XElement определяет множество явных преобразований, поэтому вы можете делать такие вещи, как это, и не нужно самим переводить методы Convert) - вместо этого вам может быть соблазн ToString, но это не дает вам того же результата (он получит весь элемент, включая открытие, закрытие и содержимое) –

+0

Кстати, поскольку в этом фрагменте примера мы не используем XDocument, чуть более простой версией будет XElement.Load файл, который получает ваш корневой элемент напрямую. Однако это всего лишь пустяки - XDocument.Load - это то, что вы хотите использовать в типичном случае. :) –

3
XmlDocument doc = new XmlDocument(); 
doc.Load("C:\\test.xml"); 
XmlNode x = doc.SelectSingleNode("/TimelineInfo/Ambassador"); 

x.InnerText возвратит содержимое

+0

Простой и эффективный. почет – Jay

4

Свойство InnerText должно работать нормально для вас.

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.innertext.aspx

FWIW, вы можете рассмотреть вопрос о переходе на API LINQ-to-XML (XElement и друзей), как ИМХО это дружественный, проще API для взаимодействия с.

System.Xml версии (Примечание: не отливка XmlElement не требуется)

var xml = @"<TimelineInfo> 
       <PreTrialEd>Not Started</PreTrialEd> 
       <Ambassador>Problem</Ambassador> 
       <PsychEval>Completed</PsychEval> 
      </TimelineInfo>"; 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
var node = doc.SelectSingleNode("/TimelineInfo/Ambassador"); 
Console.WriteLine(node.InnerText); 

LINQ к XML версии:

var xml = @"<TimelineInfo> 
       <PreTrialEd>Not Started</PreTrialEd> 
       <Ambassador>Problem</Ambassador> 
       <PsychEval>Completed</PsychEval> 
      </TimelineInfo>"; 
var root = XElement.Parse(xml); 
string ambassador = (string)root.Element("Ambassador"); 
Console.WriteLine(ambassador); 
Смежные вопросы