我有xml文件。这只是该文件的一部分
1 <mainTerm>
2 <title> Abandonment </title>
3 <see> Maltreatment </see>
4 </mainTerm>
5 <mainTerm>
6 <title> Abasia <nemod>(-astasia) (hysterical) </nemod></title>
7 <code>F44.4</code>
8 </mainTerm>
我有很多<mainTerm>
,我遍历所有这些。我复制了所有元素数据,但当我到达第6行时,我遇到了问题。如何复制所有内容?我需要到达结束字符串,这看起来像“Abasia(-astasia)(歇斯底里)”。
这是我使用该文件的应用程序
List<string> nodes = new List<string>();
//Create XmlReaderSettings object
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
settings.IgnoreComments = true;
//Create XmlReader object
XmlReader xmlIn = XmlReader.Create(path, settings);
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add(misValue);
if (xmlIn.ReadToDescendant("mainTerm"))
{
do
{
xmlIn.ReadStartElement("mainTerm");
nodes.Add(xmlIn.ReadElementContentAsString());
nodes.Add(xmlIn.ReadElementContentAsString());
} while (xmlIn.ReadToNextSibling("mainTerm"));
}
答案 0 :(得分:1)
您可以使用LINQ2XML。只需将xml结构包装在根节点中,然后获取所有标题元素,如下所示:
var xmlSrc = @"<?xml version=""1.0"" encoding=""UTF-8""?><xml><mainTerm>
<title> Abandonment </title>
<see> Maltreatment </see>
</mainTerm>
<mainTerm>
<title> Abasia <nemod>(-astasia) (hysterical) </nemod></title>
<code>F44.4</code>
</mainTerm></xml>";
var xml = XDocument.Parse(xmlSrc);
var mainTerms = xml.Root.Elements("mainTerm").ToList();
var titles = mainTerms.Elements("title").ToList();
foreach (var title in titles)
{
System.Console.WriteLine(title.Value);
}
输出结果为:
Abandonment
Abasia (-astasia) (hysterical)
这是恕我直言,比XPath和XmlReader更容易。
使用Descendants函数, mainTerm 元素不需要是根元素:
var mainTerms = xml.Root.Descendants("mainTerm").ToList();
此行提供XML文档中任何级别的所有 mainTerm !
答案 1 :(得分:0)
答案 2 :(得分:0)
您需要使用XmlDocument。我发现使用它比xmlreader容易得多。 用你的例子......
1 <mainTerm>
2 <title> Abandonment </title>
3 <see> Maltreatment </see>
4 </mainTerm>
5 <mainTerm>
6 <title> Abasia <nemod>(-astasia) (hysterical) </nemod></title>
7 <code>F44.4</code>
8 </mainTerm>
做这样的事情(对不起,没有时间通过编译器运行它......但这是一般的想法)
XmlDocument example = new XmlDocument();
example.Load(StringWhereYouHaveYourXML); //You can also load Xml in other ways... check documentation
XmlNodeList mainTerm = example.SelectNodes("/mainTerm/"); //Now you have your list of Mainterms...
//Check for children in your nodes now...
forEach(XmlNode a in mainTerm){
//check in the Title node for children that is
XmlNode title = a.SelectSingleNode("/Title/");
if (title.HasChildNodes){
XmlNode abasia = title.SelectSingleNode("/nemod/");
}
}
从那里你可以用节点做你想做的事。但是你现在可以更具体地定义它。