如何在不使用while循环的情况下获取xml内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不使用while循环的情况下获取xml内容相关的知识,希望对你有一定的参考价值。

我有一个xml文件,其中包含两个开始标记和结束标记。我需要分别在这两个标签中的内容。请检查以下内容。

<testing>
  <test>
  <text>test1</text>
  </test>
  <test>
  <text>test2</text>
  </test>   
</testing>

截至目前,我正在使用while循环并查找标记的起始索引和结束索引,然后使用substring方法获取内容。请检查以下代码。

string xml = File.ReadAllText(@"C:	esting_doc.txt");
int startindex = xml.IndexOf("<test>");
while (startindex > 0)
{
  int endIndex = xml.IndexOf("</test>", startindex);
  int length = endIndex - startindex;
  string textValue = xml.Substring(startindex, length);
  startindex = xml.IndexOf("<test>", endIndex); // getting the start index for the second test tag
}

有没有其他方法来获取内容而不使用while循环?因为使用while似乎有点昂贵,如果文本文件被破坏,那么它将导致其他问题。

在此先感谢,Anish

答案

您可以使用XPATH来解决查询XML,如下所示:

var xml = @"<testing>
  <test>
  <text>test1</text>
  </test>
  <test>
  <text>test2</text>
  </test>   
</testing>
";

var testing = XElement.Parse(xml);
var tests = testing.XPathEvaluate("test/text/text()") as IEnumerable;
foreach (var test in tests)
{
    Console.WriteLine(test); // test1, test2
}
另一答案

您可以使用基于W3C DOM(文档对象模型)的XmlDocument类和XPath类XmlDocument doc = new XmlDocument();

doc.load(@"C:	esting_doc.txt");

XmlNodeList values = doc.SelectNodes("testing/test/text");  //Using XPath

string str = string.Empty;

    foreach (XmlNode x in values)
    {
        str += x.InnerText + ",";
    }

str.TrimEnd(',');

Console.WriteLine(str);   //test1,test2
另一答案

如果您想手动执行,正则表达式可以帮助您

string xml = File.ReadAllText(@"C:	esting_doc.txt");
string pattern = "<test>(.*?)</test>";
Match match = Regex.Match(xml , pattern);
if (match.Success){
    System.Console.WriteLine(match.Groups[1].Value);
}

但想想有助于解析XML的库XMLDocumentLinQ to XML

以上是关于如何在不使用while循环的情况下获取xml内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 PHP 加载整个内容的情况下附加到大型 XML(文件)

在不使用while循环的情况下找到最里面的异常?

While(1) 循环在不休眠的情况下减少 CPU

如何在不使用PHP的循环的情况下获取对象数组的索引

如何在不使用 XML 路径和临时变量的情况下以一个逗号分隔值获取列值

如何在不单击tkinter python的情况下读取单选按钮值