在使用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并检索与用户的字符串输入相同的元素节点的名称。 关于如何检索文本值的任何建议?
问候
答案 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)
您可以使用多种方法,在您的方案中最常用的方法似乎是:
选择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();