【问题标题】:Error while converting the following StreamReader result to XML ín C#在 C# 中将以下 StreamReader 结果转换为 XML 时出错
【发布时间】:2019-01-09 21:19:29
【问题描述】:
  if (response.StatusCode == HttpStatusCode.OK)
                    {

                        using (Stream stream = response.GetResponseStream())
                        {

                            using (StreamReader reader = new StreamReader(stream))
                            {
                                res= reader.ReadToEnd();
                                XmlDocument doc = new XmlDocument();
                                doc.XmlResolver = null;
                                doc.Load(res);
                            }
                            Console.WriteLine(res);
                        }

                    }

在上面的代码中,我在 res 变量中得到了以下结果。

如何从给定的结果中获取 TID 属性。

<!DOCTYPE RESULT SYSTEM "http://today.com/email/viewemail.dtd">
<RESULT REQID="16006914462">
   <MID SUBMITDATE="2018-08-02 12:25:37" ID="1" TAG="null" TID="40293189378" />
</RESULT>

当我尝试将上述结果转换为XmlDocument 时,它会抛出异常

路径中有非法字符。

【问题讨论】:

  • 你能告诉我们你在哪里创建 XmlDocument 的代码吗?
  • @mnieto 代码已更新
  • “尝试将上述结果转换为 XmlDocument”是什么意思?您在doc.Load(html) 上遇到异常?
  • @Nino 是的。未找到预期的 DTD 标记。第 1 行,位置 3。
  • 您提到了一个res 变量。它在哪里?我试图在 XmlDocument 中加载您的 xml,它可以正常工作:dotnetfiddle.net/pCKfup

标签: c# asp.net asp.net-mvc xml-parsing


【解决方案1】:

您也可以使用 LinqXMl 来做您需要的事情。在下面的示例中,我从文本文件加载 xml 以模拟 xml 响应。接受 XML 字符串的 XDocument.Load 方法存在重载。

XDocument xdoc = XDocument.Load("C:\\test.xml");
XElement resultNode = xdoc.Elements().First().Elements().FirstOrDefault();
var tidVale = resultNode.Attributes().First(a => a.Name == "TID");

然后您可以相应地访问属性。

希望有帮助

【讨论】:

    【解决方案2】:

    StreamReader.ReadToEnd 返回一个字符串。 XmlDocument.Load 从文件或流中加载内容。

    所以你应该使用

       doc.LoadXml(res);
    

    或者您可以修改代码以从流中加载 de XmlDocument

                        using (Stream stream = response.GetResponseStream())
                        {
    
                            using (StreamReader reader = new StreamReader(stream))
                            {
                                XmlDocument doc = new XmlDocument(reader);
                                doc.XmlResolver = null;
                                doc.Load(res);
                            }
                            Console.WriteLine(res);
                        }
    

    【讨论】:

    • 如何从 doc 变量中获取 TID?
    • 您可以按照@Wheels73 的建议使用 Linq to xml。不要忘记添加using System.Xml.Linq
    • @MannanBahelim 如果你使用的是XmlDocument,你可以使用XPath来获取它,像这样:var nodes = xmlDoc.SelectNodes("*/MID[1]/@TID");,如果nodes.Count &gt; 0你可以在nodes[0].Values找到TID值
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2011-08-17
    相关资源
    最近更新 更多