XmlTextReader reader = new XmlTextReader("D://project_elysian//data.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
reader.Read();
//Response.Write(reader.Value + "</br>");
//Response.Write(reader.Depth);
switch (reader.Name)
{
case "Id": Response.Write(reader.Value + "</br>");
break;
case "Name": Response.Write(reader.Value + "</br>");
break;
}
}
}
我正在尝试读取data.xml文件并显示其指定标记的内容,但结果页面仍为空白,并且没有给出编译错误,卡住了,无法弄清楚此代码有什么问题。
答案 0 :(得分:2)
我怀疑如果您在结果页面上“查看来源”,您会看到您希望看到的数据。
问题是您的Web浏览器将这些xml元素视为未知的html标记,因此不知道如何显示它们。
您需要对输出进行“编码”,因此字符串按字面显示。
而不是写作:
Response.Write(reader.Value + "</br>");
试
Response.Write(Server.HtmlEncode(reader.Value) + "</br>");
这样做是替换&lt;与&amp; lt; &GT;与&amp; gt;还有其他几个。 “&安培; LT;”告诉浏览器呈现“&lt;”而不是将其视为标签的开头。
[修改 - 回应评论]
听起来你的情况都不是真的。在不知道源xml文件的内容的情况下,很难说 - 但是您是否尝试在案例中的Response.Writes上设置断点?它们曾被击中吗?
如果没有,那么这与我上面提到的任何内容无关 - 但是你没有得到你对读者的期望。
尝试从xml文件的一小部分示例开始,然后在调试器中逐步执行。当您点击感兴趣的内容时,尝试并确定读取器上存在哪些数据(例如reader.Name属性),并相应地修改switch语句。
[第二次编辑 - 响应示例xml]
在检查Read()
之后,您的错误就是XmlNodeType.Element
来电。您基本上是在阅读,直到找到一个元素(while Read()
调用)。找到元素后,您就会在尝试读取元素名称之前推送元素(另一个Read()
调用)。这个内部reader.Read()
确保您在尝试检查其名称时不再使用该元素。
试试这个:
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
// Capture the element name before pushing past it.
var elementName = reader.Name;
reader.Read();
//Response.Write(reader.Value + "</br>");
//Response.Write(reader.Depth);
switch (elementName)
{
case "Id":
Response.Write(reader.Value);
break;
case "Name":
Response.Write(reader.Value);
break;
}
}
}
找到这种东西的关键是仔细调试。从减少的xml文件开始,然后在调试器中实际执行,或者将调试输出写入日志或响应。这将使识别这类问题变得更加容易。
答案 1 :(得分:1)
我建议您查看XML(反)序列化而不是使用XmlReader。 .Net将验证xml,您将更容易调试Xml输入。
您只需创建一个包含镜像Xml结构的字段的类,并使用以下代码:
class searchResult
{
public List<item> itemList { get; set;}
}
复杂的字段类示例
class item
{
public int Id { get; set; }
public string Name{ get; set; }
}
实际工作如下:
XmlSerializer SerializerIn = new XmlSerializer(typeof(SerializeTest));
FileStream fs = new FileStream(@"C:\test.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
SerializeTest loadTest = (SerializeTest)SerializerIn.Deserialize(fs);
fs.Close();
其中SerializeTest是您将xml加载到的类。以这种方式工作要容易得多,因为除非它是无效的,否则你永远不需要处理原始的Xml。
您可以在此处找到更多信息:http://www.codeproject.com/Articles/4491/Load-and-save-objects-to-XML-using-serialization 可能是一个更好的教程:http://www.4guysfromrolla.com/webtech/012302-1.shtml
答案 2 :(得分:1)
由于它在交换机外工作,我猜比节点名称的情况不同。检查节点的情况
编辑:
您正在调用reader.read()两次,而reader.value将不会返回元素的正确值。
如果您仍想使用xmlreader,请查看以下代码
XmlTextReader reader = new XmlTextReader(<XML Path>)
while (reader.Read())
{ if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "Id": Response.Write(Server.HtmlEncode(reader.ReadString()) + "</br>");
break;
case "Name": Response.Write(Server.HtmlEncode(reader.ReadString()) + "</br>");
break;
}
}
}
reader.Close();