【发布时间】:2017-09-14 20:36:44
【问题描述】:
XML 文件:
<weatherdata>
<forecast>
<time day="2017-04-18">
<temperature day="-4.26" min="-6.54" max="-4.26" night="-6.54" eve="-4.26" morn="-4.26"/>
</time>
<time day="2017-04-19">
<temperature day="3.51" min="-5.41" max="4.49" night="-0.63" eve="4.27" morn="-5.41"/>
</time>
</forecast>
</weatherdata>
我需要根据要使用的 day="xxxx-xx-xx" 解析文件并获取正确的元素。然后,当我有合适的时间时,我想为 temperature_day、temperature_min 等创建具有正确值的新字符串。
我已经尝试了几十个 XmlReader 变体,我想使用它,因为它看起来很简单。这是我到目前为止所拥有的。如果我可以命名“reader.Name ==”,为什么我不能只询问属性名称?
XmlReader reader = XmlReader.Create(URL);
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "time" && reader.HasAttributes)
{
// DATE comes from a asp.net calendar, the format is correct
if (DATE == reader.GetAttribute("day"))
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "temperature" && reader.HasAttributes)
{
string temperature_day = reader.GetAttribute("day");
TextBoxTemp.Text = temperature_day;
}
}
}
}
我已经用一个非常简单的 XmlReader 代码位测试了 (URL),并确认它可以工作。我现在完全没有想法,元素内部的属性让我感到困惑。
【问题讨论】:
-
你真的需要使用
XmlReader吗? LINQ to XML(XDocument等)非常更易于使用。 -
请注意,您的
if (... reader.Name == "temperature"...)条件永远不会为真,因为您已经确定您的阅读器位于Name为"time"的节点上。这就是使用XmlReader的诀窍——它一次读取一个节点。 @JonSkeet 关于使用 LINQ to XML 的建议很好,甚至使用古老的XmlDocument可能更容易掌握。 -
嗯,不一定。我查看了 XDocument,它看起来比 XmlReader 复杂得多......我想我可以只命名我正在寻找的属性,但显然我不能,除非我做错了什么。
-
“它看起来比 XmlReader 复杂得多” - 真的,真的不是。查询已加载的文档比使用实时解析器要容易很多。关于使用 LINQ to XML 进行查询有 很多 个问题。
-
然后我会看看 LINQ to XML,谢谢你们@JonSkeet
标签: c# asp.net xml parsing xmlreader