使用xmldocument读取xml

  4/12/13 Mrinal xmlTest  

我正在尝试使用c#读取上面的xml,但是我在try catch块中得到nullexception可以任何正文建议所需的更改。

 static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xd.Load("C:/Users/mkumar/Documents/testcase.xml"); XmlNodeList nodelist = xd.SelectNodes("/testcase"); // get all  nodes foreach (XmlNode node in nodelist) // for each  node { CommonLib.TestCase tc = new CommonLib.TestCase(); try { tc.name = node.Attributes.GetNamedItem("date").Value; tc.date = node.Attributes.GetNamedItem("name").Value; tc.sub = node.Attributes.GetNamedItem("subject").Value; } catch (Exception e) { MessageBox.Show("Error in reading XML", "xmlError", MessageBoxButtons.OK); } 

…….. …..

testcase元素没有属性。 您应该关注它的子节点:

 tc.name = node.SelectSingleNode("name").InnerText; tc.date = node.SelectSingleNode("date").InnerText; tc.sub = node.SelectSingleNode("subject").InnerText; 

您可以像这样处理所有节点:

 var testCases = nodelist .Cast() .Select(x => new CommonLib.TestCase() { name = x.SelectSingleNode("name").InnerText, date = x.SelectSingleNode("date").InnerText, sub = x.SelectSingleNode("subject").InnerText }) .ToList(); 

您可以使用LINQ to XML从xml中选择所有testcase元素并将它们解析为TestCase实例:

 var xdoc = XDocument.Load("C:/Users/mkumar/Documents/testcase.xml"); var testCases = from tc in xdoc.Descendants("testcase") select new CommonLib.TestCase { date = (string)tc.Element("date"), name = (string)tc.Element("name"), sub= (string)tc.Element("subject") }; 

顺便说一下,你目前只有一个testcase元素,它是XML文件的根目录。 所以,你可以这样做:

 var tc = XElement.Load("C:/Users/mkumar/Documents/testcase.xml"); var testCase = new CommonLib.TestCase { date = (string)tc.Element("date"), name = (string)tc.Element("name"), sub= (string)tc.Element("subject") }; 
 private static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xd.Load("C:\\test1.xml"); XmlNodeList nodelist = xd.SelectNodes("/testcase"); // get all  nodes foreach (XmlNode node in nodelist) // for each  node { try { var name = node.SelectSingleNode("date").InnerText; var date = node.Attributes.GetNamedItem("name").Value; var sub = node.Attributes.GetNamedItem("subject").Value; } catch (Exception e) { MessageBox.Show("Error in reading XML", "xmlError", MessageBoxButtons.OK); } } 

这将工作我测试它@Alex正确的答案

您正在尝试读取属性,而date, namesubject不是属性。 它们是子节点。

你的代码应该是这样的

 XmlDocument xd = new XmlDocument(); xd.Load("test.xml"); XmlNodeList nodelist = xd.SelectNodes("/testcase"); // get all  nodes foreach (XmlNode node in nodelist) // for each  node { try { string name = node.SelectSingleNode("name").InnerText; string date = node.SelectSingleNode("date").InnerText; string sub = node.SelectSingleNode("subject").InnerText; } catch (Exception ex) { MessageBox.Show("Error in reading XML", "xmlError", MessageBoxButtons.OK); } } 

您的Xml不包含属性。 日期,名称和主题 – 它是测试用例节点的子节点。 试试这个:

 ... tc.name = node["name"].InnerText; ... 

或这个:

 ... tc.name = node.SelectSingleNode("name").InnerText; ...