检索xml文本值

时间:2011-05-25 07:53:24

标签: c# xml

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

我已将元素节点的各种名称分配给字符串值,并且用户需要向控制台输入字符串值,如果name标记与输入相同,则检索位于该位置的文本值标签。 这是我使用的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并检索与用户的字符串输入相同的元素节点的名称。 关于如何检索文本值的任何建议?

问候

2 个答案:

答案 0 :(得分:1)

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

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

更简单!

答案 1 :(得分:0)

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

  1. XmlDocument + XPath (所有.NET版本均支持)
  2. XmlReader (在所有.NET版本中均受支持)
  3. XDocument (自.NET 3.0起支持LINQ)
  4. 使用LINQ 语法
  5. 的XDocument

    选择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();