我在C#中遇到了XMLReader的问题。
我得到了这个代码:
private void countryXMLReader ()
{
XmlTextReader reader = new XmlTextReader("expenses.xml");
List<string> twentyFour = new List<string>();
while (reader.Read())
{
if (reader.Name.Equals("_24h"))
{
twentyFour.Add(reader.Value);
}
if (reader.Name == "_14h")
{
//MessageBox.Show(reader.Name);
}
}
}
这是我的XML文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<expenses>
<country>
<name>Germany</name>
<ID>D</ID>
<_24h>42</_24h>
<_14h>28</_14h>
<_8h>14</_8h>
<overnight>100</overnight>
</country>
<country>
<name>India</name>
<ID>IND</ID>
<_24h>30</_24h>
<_14h>20</_14h>
<_8h>10</_8h>
<overnight>120</overnight>
</country>
</expenses>
ListItems被添加到列表中,但reader.Value总是空的。
我怎样才能让它发挥作用?
非常感谢托比
编辑:
现在我得到了以下代码:
private void countryXMLReader() { 列出twentyFour = new List();
XDocument doc = XDocument.Load(@"C:\Users\Bl!tz\Documents\Visual Studio 2010\Projects\MBG.SimpleWizard\Demo\bin\Debug\expenses.xml");
twentyFour.AddRange(doc
.Elements("expenses")
.Descendants("country")
.Descendants("_24h")
.Select(i => i.Value)
.ToList());
}
但它并没有真正获得价值。
可能是我的问题?
EDIT2:
这是我使用的代码:
private void countryXMLReader ()
{
List<string> twentyFour = new List<string>();
XDocument doc = XDocument.Load(@"expenses.xml");
twentyFour.AddRange(doc
.Elements("expenses")
.Descendants("country")
.Descendants("name")
.Descendants("ID")
.Descendants("_24h")
.Descendants("_14h")
.Descendants("_8h")
.Descendants("overnight")
.Select(i => i.Value)
.ToList());
}
但List.Count保持为0.我将此方法称为:
public Page1()
{
InitializeComponent();
countryXMLReader();
}
我也用按钮测试了它,但结果相同
答案 0 :(得分:0)
尝试使用XmlDocument和XPath表达式的代码:
string s = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><expenses> <country> <name>Germany</name> <ID>D</ID> <_24h>42</_24h> <_14h>28</_14h> <_8h>14</_8h> <overnight>100</overnight> </country> <country> <name>India</name> <ID>IND</ID> <_24h>30</_24h> <_14h>20</_14h> <_8h>10</_8h> <overnight>120</overnight></country></expenses>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(s);
XmlNode rootNode = doc.SelectSingleNode(@"/expenses");
var nodes24 = rootNode.SelectNodes(@"country/_24h");
var nodes14 = rootNode.SelectNodes(@"country/_14h");
List<string> twentyFour = new List<string>();
twentyFour.AddRange(nodes24
.Cast<XmlNode>()
.Select(i => i.InnerText)
.ToArray());
您也可以尝试使用System.Xml.Linq方法,该方法比XmlDocument更新,但要求NET版本高于3.0:
List<string> names = new List<string>();
List<string> twentyFour = new List<string>();
List<string> fourteen = new List<string>();
XDocument doc = XDocument.Load(@"expenses.xml");
var elements = doc
.Root
.Descendants("country");
names.AddRange(elements
.Descendants("name")
.Select(i => i.Value)
.ToList());
twentyFour.AddRange(elements
.Descendants("_24h")
.Select(i => i.Value)
.ToList());
fourteen.AddRange(elements
.Descendants("_14h")
.Select(i => i.Value)
.ToList());
// You can process each country element individually like this
foreach (XElement el in elements)
{
string name = el.Element("name").Value;
string _24h = el.Element("_24h").Value;
string _14h = el.Element("_14h").Value;
}
答案 1 :(得分:0)
要在XmlReader
中使用ReadElementContentAsString()
提供元素内容的字符串值。
而不是
twentyFour.Add(reader.Value);
使用
twentyFour.Add(reader.ReadElementContentAsString());