【问题标题】:Parsing XML in C# from stream从流中解析 C# 中的 XML
【发布时间】:2023-03-30 18:36:01
【问题描述】:

我尝试了几种方法,从 Linq 到将数据加载到 XML 文档,但我似乎无法返回我需要的结果。

这是示例 XML:

<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service" xmlns:com="http://www.webex.com/schemas/2002/06/common" xmlns:event="http://www.webex.com/schemas/2002/06/service/event"><serv:header><serv:response><serv:result>SUCCESS</serv:result><serv:gsbStatus>PRIMARY</serv:gsbStatus></serv:response></serv:header><serv:body><serv:bodyContent xsi:type="event:createEventResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><event:sessionKey>11111111</event:sessionKey><event:guestToken>111111111111111111111</event:guestToken></serv:bodyContent></serv:body></serv:message>

而且,这是我尝试做的:

StreamReader reader = new StreamReader(dataStream);
XmlDocument doc = new XmlDocument();
doc.LoadXml(reader.ReadToEnd());
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
XmlNamespaceManager ns2 = new XmlNamespaceManager(doc.NameTable);
XmlNamespaceManager ns3 = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("serv", "http://www.webex.com/schemas/2002/06/service");
ns2.AddNamespace("com", "http://www.webex.com/schemas/2002/06/common");
ns3.AddNamespace("event", "http://www.webex.com/schemas/2002/06/service/event");
XmlNode node = doc.SelectSingleNode("result",ns);

然而,出于某种原因,我似乎永远无法返回实际结果,根据上面的实际 xml,它应该是“成功”或“失败”。

我该怎么做?

【问题讨论】:

    标签: c# xml parsing webex


    【解决方案1】:

    您的 xpath 查询不正确。

    试试这个:

    XmlNode node = doc.SelectSingleNode("//serv:result",ns);
    

    XmlNode node = doc.SelectSingleNode("serv:message/serv:header/serv:response/serv:result",ns);
    

    【讨论】:

    • 谢谢,第二个对我有用,但是当我执行 node["serv:result"].Value.ToString() 时,它似乎不想返回实际结果。我应该使用 Innertext 执行此操作以返回结果吗?
    • 它给出了在 WeBeX Demo.exe System.NullReferenceException 中发生的“System.NullReferenceException”类型的第一次机会异常:对象引用未设置为对象的实例。
    • 把你的代码分解成更小的部分......有些东西是空的。这么少的代码很难说
    • 这是我使用的代码: XmlNode node = doc.SelectSingleNode("serv:message/serv:header/serv:response/serv:result",ns); if (node != null) { Console.WriteLine("not null"); Console.WriteLine(node.Value.ToString()); } else { Console.WriteLine("null");它返回:not null 在 WeBeX Demo.exe System.NullReferenceException 中发生的“System.NullReferenceException”类型的第一次机会异常:对象引用未设置为对象的实例。
    【解决方案2】:

    这行得通:

    XDocument doc = XDocument.Load(@"test.xml");
    XNamespace serv = "http://www.webex.com/schemas/2002/06/service";
    var result = doc.Descendants(serv + "result").First().Value;
    

    【讨论】:

    • 尝试将“var”写入命令行时,我的代码出现错误:mscorlib.dll System.ArgumentException 中出现“System.ArgumentException”类型的第一次机会异常:非法路径中的字符。也尝试将其更改为字符串,但结果相同。
    • 我用你的XML作为输入测试了这段代码,它运行良好,result实际上是string类型,你可以这样使用它,即Console.WriteLine(result)
    • 我知道我做错了什么。我使用 XDocument.Load() 而不是 XDocument.Parse() 考虑到我是从流阅读器中使用它。效果很好,正好返回了我需要的东西!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多