【问题标题】:Use where condition for retrieving the xml data with C#使用 where 条件通过 C# 检索 xml 数据
【发布时间】:2013-06-19 08:37:39
【问题描述】:

我想从 xml 文件中获取数据。我正在从上一页获取节点的 ID。在下一页上,我想显示该 id 的 xml 中的数据。我正在使用查询字符串传递节点的 id,但是当我运行我的代码时,它给了我这个错误

System.Xml.XmlException:根级别的数据无效。第 1 行,位置 1。

这是我的代码

XElement xid = XElement.Parse(Request.QueryString["ID"]);

// var id = Request.QueryString["ID"];

var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml"));
var result = doc.Descendants("post")
                .Where(x => x.Element("id") == xid)
                .Select(x => new
                {
                    id = x.Element("id").Value,
                    title = x.Element("title").Value,
                    Discription = x.Element("Discription").Value,
                    dt = x.Element("dt").Value,
                    mnt = x.Element("mnt").Value,
                    yr = x.Element("yr").Value
                }).OrderByDescending(x => x.id).Take(5);

Repeater1.DataSource = result;
Repeater1.DataBind();

这是我的 xml

<?xml version="1.0" encoding="utf-8"?>
<content>
  <post>
    <id>1</id>
    <title>fds</title>
    <Discription>fdsafsdf</Discription>
    <dt>21</dt>
    <mnt>6</mnt>
    <yr>2013</yr>
  </post>
</content>

请告诉我哪里出错了

【问题讨论】:

  • 请在您的帖子中包含示例 XML。
  • @MikePrecup 请立即查看 xml
  • 这是导致错误的行吗? XElement xid = XElement.Parse(Request.QueryString["ID"]); 如果是这样,那是因为您试图将非 XML 的内容分配给 XElement。试试int id = Convert.ToInt32(Request.QueryString["ID"]);
  • 运算符 '==' 不能应用于类型为 'System.Xml.Linq.XElement' 和 'int' 的操作数现在给我这个错误

标签: c# xml asp.net-mvc linq


【解决方案1】:

你没有指出导致错误的行,但我敢打赌是这个:

XElement xid = XElement.Parse(Request.QueryString["ID"]);

您的查询字符串中的“ID”很可能是某种标识符,不是 XML - 因此是错误。

你想要的是这样的:

string xid = Request.QueryString["ID"];

然后你可以在你的where 子句中使用它。

此外,您的 where 子句中有一个错误 - 您正在尝试将 XElement 与一个值进行比较 - 您需要使用它的 Value 属性获取 XElement 的值:

Where(x => x.Element("id").Value == xid)

XElement.Value 返回一个字符串 - 所以只需从查询字符串中获取字符串值并在 where 子句的比较中使用它。

把所有东西放在一起

string xid = Request.QueryString["ID"];

var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml"));
var result = doc.Descendants("post")
                .Where(x => x.Element("id").Value == xid)
                .Select(x => new
                {
                    id = x.Element("id").Value,
                    title = x.Element("title").Value,
                    Discription = x.Element("Discription").Value,
                    dt = x.Element("dt").Value,
                    mnt = x.Element("mnt").Value,
                    yr = x.Element("yr").Value
                }).OrderByDescending(x => x.id).Take(5);

Repeater1.DataSource = result;
Repeater1.DataBind();

【讨论】:

  • 我使用这个,我在第 27 行第 26 行得到这个错误检查: var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml"));第 27 行: var result = doc.Descendants("post").Where(x => x.Element("id") == id).Select(x => new 第 28 行:{ 第 29 行:id = x.元素("id").Value,
  • 您需要使用x =&gt; x.Element("id").Value == id) - 您的代码编写方式是您尝试将字符串与 XElement 进行比较。
  • 对不起,我没有先添加 .value,但之后我收到此错误:System.Xml.XmlException:根级别的数据无效。第 1 行,位置 1。源错误:第 20 行:private void BindRep() 第 21 行:{ 第 22 行:XElement xid = XElement.Parse(Request.QueryString["ID"]);第 23 行:
  • XElement xid = XElement.Parse(Request.QueryString["ID"]) 将不起作用。我已经发布了完整的代码,其中包含您需要在我的答案中进行的两项更改。
  • :( 现在在第 28 行给我这个错误我认为 x.element("id") 是空的异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。源错误: 第 26 行:var doc = XDocument.Load(Server.MapPath("~/Data/BlogContent.xml")); 第 27 行:var result = doc.Descendants("post") 第 28 行:.Where(x => x.Element("id").Value == xid).Select(x => new Line 29: { Line 30: id = x.Element("id").Value,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2023-03-24
  • 2016-07-26
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多