我尝试读取一个具有将近8个子节点节点但没有成功的xml文件。 我尝试使用LINQ,SelectNode,SelectSingleNode,并尝试在XMLNodeList上使用愚蠢的foreach。 我的最后一个意图是,在XMLNodeList上使用这个愚蠢的foreach尝试捕获某些节点的文本或值。 这些节点的深度不同,但是我可以只获得sequesnse中的第一个元素,而其余的仅重复firs值。
这是我的代码的一部分。
XmlDocument xDocXML = new XmlDocument();
xDocXML.Load(file_name);//file_name is a string with the full path of the file
XmlNodeList Article = xDocXML.SelectNodes("/ArticleSet/Article/Document"); //We get the Document of the article
foreach(XmlNode n in Article)
{
spmid = n["ID"].InnerText;
liga = string.Concat(TestString1, spmid);
//Test 1
//stitle = n.SelectSingleNode("//Article/ArticleTitle").InnerText;
//Test 2
//stitle = n["//Article/ArticleTitle"].InnerText;
XmlNode titles = n.SelectSingleNode("//Article/ArticleTitle");
stitle = titles.InnerText;//This line only work once and it repeat in all xmlnodes read
camposcuenta = camposcuenta + 1;
dt_abstractdb.Rows.Add(new Object[] { camposcuenta.ToString(), spmid, stitle, sresum, liga, ligaPDF, ligadoi });
}
对此有何建议
答案 0 :(得分:1)
在不知道您的XML是什么样的情况下,我建议创建一个类来表示您的XML文件,然后使用序列化。使用此解决方案,您可以拥有多个级别,并让框架来处理它们。
例如,检查以下内容:How to Deserialize XML document
您还可以使用外部工具来生成POCO类,例如:https://xmltocsharp.azurewebsites.net/
链接解决方案中的示例代码:
代表您的XML的类:
[Serializable()]
public class Car
{
[System.Xml.Serialization.XmlElement("StockNumber")]
public string StockNumber { get; set; }
[System.Xml.Serialization.XmlElement("Make")]
public string Make { get; set; }
[System.Xml.Serialization.XmlElement("Model")]
public string Model { get; set; }
}
[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
[XmlArray("Cars")]
[XmlArrayItem("Car", typeof(Car))]
public Car[] Car { get; set; }
}
阅读代码:
CarCollection cars = null;
string path = "cars.xml";
XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();