2011-05-25 61 views
0

想在使用C#处理xml数据时请教一些建议。 我有一个小练习练习,我需要检索特定标签处的特定文本值。检索xml文本值

我已经将元素节点的各种名称分配给字符串值,并且用户需要向控制台输入字符串值,并且如果名称标记与输入相同,则检索定位在该标签。 这是我使用的C#代码,但我不知道如何检索名称标签处的文本值。

int priceSpecific; 
     string destination; 
     ArrayList array = new ArrayList(); 
     xRootNode = xdoc.DocumentElement; 

     string firstValue = xRootNode.FirstChild.FirstChild.Name; 
     string secondValue = xRootNode.FirstChild.FirstChild.NextSibling.Name; 
     string thirdValue = xRootNode.FirstChild.FirstChild.NextSibling.NextSibling.Name; 
     string fourthValue = xRootNode.FirstChild.FirstChild.NextSibling.NextSibling.NextSibling.Name; 
     array.AddRange(new object[] { firstValue, secondValue, thirdValue, fourthValue}); 

     Console.WriteLine("Please enter your destination, first letter capital"); 
     destination = Console.ReadLine(); 

想法是循环arraylist并检索与用户的字符串输入相同的元素节点的名称。 有关如何检索文本值的任何建议?

Regards

+0

你们是不是要选择按名称和它的值的节点? – varadarajan 2011-05-25 07:59:34

回答

1

这是一些非常讨厌的代码!我建议你花几个小时学习Linq-to-XML。大致来说,如果要查找具有给定名称的元素的值,可以按如下方式完成:

string elementName = "foo"; 
XDocument doc = XDocument.Parse("<xml document goes here>"); 
string matchedValue = doc.Descendants(elementName).Single().Value; 

更简单!

+0

谢谢我知道,代码是恐怖的。 – Arianule 2011-05-25 08:25:47

0

您可以使用多种方法,在方案中最有用似乎是:

  1. 的XmlDocument +的XPath(在所有的.NET版本支持)
  2. 的XmlReader(在所有.NET支持版本)
  3. 的XDocument(因为.NET 3.0)
  4. 的XDocument无线与LINQ支持第LINQ语法

选择3或4,优选如果.NET 3或以上可与XML文档不是太大(几个MB的文档尺寸的边界)。

选择1使用XPath,这允许非常强的查询到文档结构


1.

XPathDocument document = new XPathDocument(@"myFile.xml"); 
XPathNavigator navigator = document.CreateNavigator(); 
string foundElementContent = 
    navigator.SelectSingleNode("//myElement[position()=1]/text()").ToString(); 

2.

string elementNameToFind = "myElement"; 
XmlReader xmlReader = XmlReader.Create(@"myFile.xml"); 
string foundElementContent = string.Empty; 
while (xmlReader.Read()) 
{ 
    if(xmlReader.NodeType==XmlNodeType.Element && 
     xmlReader.Name == elementNameToFind) 
    { 
    foundElementContent=xmlReader.ReadInnerXml(); 
    break; 
    } 
} 
xmlReader.Close(); 

3.

string elementNameToFind = "myElement"; 
XDocument xmlInMemoryDoc = XDocument.Load(@"myFile.xml"); 
XElement foundElement = xmlInMemoryDoc.Descendants(elementNameToFind).First(); 

4.

string elementNameToFind = "myElement"; 
XDocument xmlInMemoryDoc = XDocument.Load(@"myFile.xml"); 
XElement foundElement = 
    (
    from e in xmlInMemoryDoc.Descendants() 
    where e.Name == elementNameToFind 
    select e 
).First();