Asp.net 如何从XDocument实例/对象获取值

Asp.net 如何从XDocument实例/对象获取值,asp.net,xml,Asp.net,Xml,我对使用XML编程相当陌生,在访问/操作该数据类型中的值时遇到了困难。我使用了一个字符串变量xmlDoc,并分配了xml文档(字符串格式)xmlDoc=drvEval.Row[“EvalAnswers”].ToString() 当我试着运行这个时 foreach(答案中的变量答案) { 回答。写(“ddl_item=“+answer.item+”answer=“+answer.answer+”); } 它只给我一个输出。结果的第一个节点,而不是我解析的xml文档的所有内容。以下是完整的代码:

我对使用XML编程相当陌生,在访问/操作该数据类型中的值时遇到了困难。我使用了一个字符串变量
xmlDoc
,并分配了xml文档(字符串格式)
xmlDoc=drvEval.Row[“EvalAnswers”].ToString()

当我试着运行这个时

foreach(答案中的变量答案)
{
回答。写(“ddl_item=“+answer.item+”answer=“+answer.answer+”
); }

它只给我一个输出。结果的第一个节点,而不是我解析的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 />");
    }

}
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 />");
    }

}
private void ddl\u Eval\u SelectedIndexChanged(对象发送方,System.EventArgs e)
{
//Write(ddl_Eval.SelectedValue.ToString()+“”+”值:“+ddl_Eval.SelectedIndex);
dtEval=新数据表();
dtEval=data.GetEvaluation2();
DataView-dvEval=dtEval.DefaultView;
string xmlDoc=string.Empty;
foreach(dvEval中的DataRowView drvEval)
{
if(drvEval.Row[“EvaluationID”].ToString()=ddl_Eval.SelectedValue.ToString())
{
xmlDoc=drvEval.Row[“EvalAnswers”].ToString();
}
}
XDocument xdoc=新的XDocument();
xdoc=XDocument.Parse(xmlDoc);
//Response.Write(xmlDoc);
var answers=来自xdoc.subjects中的应答(“应答”)
选择新的
{
答案=答案。元素(“答案”)。值,
Item=answer.Element(“answer”).Attribute(“Item”).Value,
};
foreach(答案中的var答案)
{
回答。写(“ddl_item=“+answer.item+”answer=“+answer.answer+”
); } }
这是我从SQL中得到的XML(字符串格式,而不是XML数据类型)


您应该向XML文件添加元素,而不是每次只为字符串指定一行(并覆盖以前添加的内容)

如果要使用此方法,请使用:

xmlDoc += drvEval.Row["EvalAnswers"].ToString();
或者更有效地

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到XML的方法:

或者,如果您有大量数据,请使用XmlWriter或XmlTextWriter,这将在磁盘上创建一个高效的文件


哇!在做了更彻底的研究之后,我能够回答我自己的问题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);

    //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 />");
    }

}
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 />");
    }

}
private void ddl\u Eval\u SelectedIndexChanged(对象发送方,System.EventArgs e)
{
//Write(ddl_Eval.SelectedValue.ToString()+“”+”值:“+ddl_Eval.SelectedIndex);
dtEval=新数据表();
dtEval=data.GetEvaluation2();
DataView-dvEval=dtEval.DefaultView;
string xmlDoc=string.Empty;
foreach(dvEval中的DataRowView drvEval)
{
if(drvEval.Row[“EvaluationID”].ToString()=ddl_Eval.SelectedValue.ToString())
{
xmlDoc=drvEval.Row[“EvalAnswers”].ToString();
}
}
XDocument xdoc=新的XDocument();
xdoc=XDocument.Parse(xmlDoc);
foreach(xdoc.Root.Elements(“应答”)中的XElement子元素)
{
Response.Write(child.Attribute(“item”).Value+“”+child.Value+“
”); } }
现在我可以得到答案的值和item属性的值。

可能的重复项