显示文件中特定XML标记的数据时出错?

时间:2012-02-07 12:11:47

标签: asp.net xml

    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文件并显示其指定标记的内容,但结果页面仍为空白,并且没有给出编译错误,卡住了,无法弄清楚此代码有什么问题。

3 个答案:

答案 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();