簡體   English   中英

使用xmldocument讀取xml

[英]using xmldocument to read xml

 <?xml version="1.0" encoding="utf-8" ?> 

  <testcase>
      <date>4/12/13</date>
      <name>Mrinal</name>
      <subject>xmlTest</subject>
  </testcase>

我試圖使用c#讀取上面的xml,但是我在try catch塊中得到null異常可以任何正文建議所需的更改。

static void Main(string[] args)
        {        

            XmlDocument xd = new XmlDocument();
            xd.Load("C:/Users/mkumar/Documents/testcase.xml");

            XmlNodeList nodelist = xd.SelectNodes("/testcase"); // get all <testcase> nodes

            foreach (XmlNode node in nodelist) // for each <testcase> 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<XmlNode>()
    .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 <testcase> nodes

  foreach (XmlNode node in nodelist) // for each <testcase> 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 <testcase> nodes

foreach (XmlNode node in nodelist) // for each <testcase> 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;
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM