2011-04-28 19 views
1

我在使用XML进行编程方面相当新颖,而且在访问/操作该数据类型中的值时遇到困难。我用了一个字符串变量xmlDoc和分配的XML文档(以字符串格式)xmlDoc = drvEval.Row["EvalAnswers"].ToString();如何从XDocument实例/对象获取值

当我试图运行此,

foreach (var answer in answers) { Response.Write("ddl_item=" + answer.Item + " answer=" + answer.Answer + "<br />"); }

它只是给了我一个输出。结果的第一个节点,而不是我解析的xml文档的所有内容。下面是完整的代码:

private void ddl_Eval_SelectedIndexChanged (Object sender, System.EventArgs e) 
{ 
    //Response.Write(ddl_Eval.SelectedValue.ToString() + " " + "value: " + ddl_Eval.SelectedIndex); 

    dtEval = new DataTable(); 
    dtEval = data.GetEvaluation2(); 
    DataView dvEval = dtEval.DefaultView; 

    string xmlDoc = String.Empty; 

    foreach (DataRowView drvEval in dvEval) 
    { 
     if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString()) 
     { 
      xmlDoc = drvEval.Row["EvalAnswers"].ToString(); 
     } 
    } 

    XDocument xdoc = new XDocument(); 
    xdoc = XDocument.Parse(xmlDoc); 

    //Response.Write(xmlDoc); 

    var answers = from answer in xdoc.Descendants("ANSWERS") 
     select new 
     { 
      Answer = answer.Element("Answer").Value, 
      Item = answer.Element("Answer").Attribute("item").Value, 
     }; 

    foreach (var answer in answers) 
    { 
      Response.Write("ddl_item=" + answer.Item + " answer=" + answer.Answer + "<br />"); 
    } 

} 

,这里是从SQL的XML我有(字符串格式,而不是XML数据类型)

<ANSWERS> <Answer item="ddl_3">A</Answer> <Answer item="ddl_8">A</Answer> <Answer item="ddl_13">Y</Answer> <Answer item="ddl_16">Y</Answer> <Answer item="ddl_19">Y</Answer> <Answer item="ddl_22">N</Answer> <Answer item="ddl_26">Y</Answer> <Answer item="ddl_30">N</Answer> <Answer item="ddl_34">Y</Answer> <Answer item="ddl_38">N</Answer> <Answer item="ddl_42">StarLight</Answer> </ANSWERS>

我想要做的就是让所有的Answer的值和item属性的值。我究竟做错了什么?请帮助,因为我完全卡住了。 :(

我得到这个链接上的概念:(和覆盖你以前添加的内容)Using LINQ to XML to Add Data to XML File in C#

+0

[如何从SQL表中的列获取XML数据?](http://stackoverflow.com/questions/5812733/how-to-get-xml-data-from-a-column-在-AN-SQL的表) – 2011-04-29 00:26:55

回答

0

您应该添加元素的XML文件,而不是每次只分配一个行的字符串。

如果你想用这种方法使用:

xmlDoc += drvEval.Row["EvalAnswers"].ToString(); 

以上effieciently

StringBuilder xmlDoc = new StringBuilder(); 

foreach (DataRowView drvEval in dvEval) 
{ 
    if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString()) 
     { 
       xmlDoc.Append(drvEval.Row["EvalAnswers"].ToString()); 
     } 
} 

但我建议的LINQ to XML的方法:

Data To XML

,或者如果你有大量的数据使用的XmlWriter或XmlTextWriter对象,这将在磁盘上创建和高效的文件。

XmlWriter

0

哎!经过更彻底的研究后,我能够回答我自己的问题。 :d

下面是完整的代码:

private void ddl_Eval_SelectedIndexChanged (Object sender, System.EventArgs e) 
{ 
    //Response.Write(ddl_Eval.SelectedValue.ToString() + " " + "value: " + ddl_Eval.SelectedIndex); 

    dtEval = new DataTable(); 
    dtEval = data.GetEvaluation2(); 
    DataView dvEval = dtEval.DefaultView; 

    string xmlDoc = String.Empty; 

    foreach (DataRowView drvEval in dvEval) 
    { 
     if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString()) 
     { 
      xmlDoc = drvEval.Row["EvalAnswers"].ToString(); 
     } 
    } 

    XDocument xdoc = new XDocument(); 
    xdoc = XDocument.Parse(xmlDoc); 

    foreach (XElement child in xdoc.Root.Elements("Answer")) 
    { 
     Response.Write(child.Attribute("item").Value + " " + child.Value + "<br />"); 
    } 

} 

现在我能得到答案的值和项目属性的值。