无法从 xml 读取到 <>使用linq,获取空值

发布于 2024-09-13 00:41:42 字数 1551 浏览 3 评论 0 原文

我有一个 XML 文件:

<?xml version="1.0" encoding="us-ascii"?>
<TestItems xmlns="http://www.blogger.com">
  <TestItem correct="0" incorrect="0">
    <Question>question</Question>
    <Answer>answer</Answer>
    <Tags>test1;test2</Tags>
  </TestItem>
  <TestItem correct="0" incorrect="0">
    <Question>question3</Question>
    <Answer>answer3</Answer>
    <Tags>tagA;tagB;tagC</Tags>
  </TestItem>
</TestItems>

我还有一个对象:

class TestItem
{
    public string Question { get; set; }
    public string Answer { get; set; }
    public int NumberCorrect { get; set; }
    public int NumberIncorrect { get; set; }
    public string Tags { get; set; }
}

这是我用来将数据读入内存的代码:

XDocument ktdb = XDocument.Load("KTdb.xml");

XNamespace ns = ktdb.Root.Name.Namespace;

var testItems = from item in ktdb.Descendants(ns + "TestItem")
    select new TestItem
    {
        Question = item.Element(ns + "Question").Value,
        Answer = (string)item.Element(ns + "Answer").Value,
        Tags = item.Element(ns + "Tags").Value,
        NumberCorrect = Convert.ToInt32(item.Attribute(ns + "correct").Value),
        NumberIncorrect = Convert.ToInt32(item.Attribute(ns + "incorrect").Value)
    };

但它不允许我这样做。执行 LINQ 语句时,会在 TestItem 对象上调用默认构造函数,然后出现 null 异常,因为 item.Element(ns + "Question").Value 为 null。

为什么我会收到错误消息?如何修复我的代码?

谢谢。

I have an XML file:

<?xml version="1.0" encoding="us-ascii"?>
<TestItems xmlns="http://www.blogger.com">
  <TestItem correct="0" incorrect="0">
    <Question>question</Question>
    <Answer>answer</Answer>
    <Tags>test1;test2</Tags>
  </TestItem>
  <TestItem correct="0" incorrect="0">
    <Question>question3</Question>
    <Answer>answer3</Answer>
    <Tags>tagA;tagB;tagC</Tags>
  </TestItem>
</TestItems>

I also have an object:

class TestItem
{
    public string Question { get; set; }
    public string Answer { get; set; }
    public int NumberCorrect { get; set; }
    public int NumberIncorrect { get; set; }
    public string Tags { get; set; }
}

And here is the code that I use to read the data into memory:

XDocument ktdb = XDocument.Load("KTdb.xml");

XNamespace ns = ktdb.Root.Name.Namespace;

var testItems = from item in ktdb.Descendants(ns + "TestItem")
    select new TestItem
    {
        Question = item.Element(ns + "Question").Value,
        Answer = (string)item.Element(ns + "Answer").Value,
        Tags = item.Element(ns + "Tags").Value,
        NumberCorrect = Convert.ToInt32(item.Attribute(ns + "correct").Value),
        NumberIncorrect = Convert.ToInt32(item.Attribute(ns + "incorrect").Value)
    };

But it would not let me do that. When the LINQ statement is executed, the default constructor is called on the TestItem object, and then I get the null exception because item.Element(ns + "Question").Value is null.

Why do I get the error? How do I fix my code?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长途伴 2024-09-20 00:41:42

更改为:

NumberCorrect = Convert.ToInt32(item.Attribute(ns + "correct").Value),
NumberIncorrect = Convert.ToInt32(item.Attribute(ns + "incorrect").Value)

更改为:

NumberCorrect = Convert.ToInt32(item.Attribute("correct").Value),
NumberIncorrect = Convert.ToInt32(item.Attribute("incorrect").Value)

即从属性名称中删除 ns 的串联。

Change this:

NumberCorrect = Convert.ToInt32(item.Attribute(ns + "correct").Value),
NumberIncorrect = Convert.ToInt32(item.Attribute(ns + "incorrect").Value)

To this:

NumberCorrect = Convert.ToInt32(item.Attribute("correct").Value),
NumberIncorrect = Convert.ToInt32(item.Attribute("incorrect").Value)

i.e. Remove the concatenation of ns from the attribute name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文