读取异常xml的节点 - XmlDocument - 表达式必须评估为一个节点集合

8 浏览
0 Comments

读取异常xml的节点 - XmlDocument - 表达式必须评估为一个节点集合

我阅读并尝试了许多帖子 - 这个答案这个这个答案。然而,它们对我来说不适用,因为我的XML确实不常见:

var xmlString = @"

    87
        
            
            
                
                    
                        
                            
                            
                            0
                            0
                            4
                            0
                            Something was wrong
                            Foo Data
                        
                    
                
            ]]>
        
";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
var errorMessage = xmlDoc.SelectSingleNode("/GetReply/InformOne/InfoReply/CDATA/S:Container/S:Body/ns2:getReference31IPOResponse/return/errorMessage");

然而,我看到以下错误:

'表达式必须评估为一个节点集。'

此外,我甚至尝试获取 InfoReply,然而错误是相同的:

var errorMessage = xmlDoc.SelectSingleNode("/GetReply/InformOne/InfoReply/");

我想要的是读取 errorMessage 节点中的文本。

请告诉我,我做错了什么?

非常感谢任何帮助。

看起来 破坏了对其余节点的读取。

0
0 Comments

在上述内容中,出现了一个关于“Read node of unusual xml - XmlDocument - Expression must evaluate to a node-set”的问题。该问题出现的原因是XML中存在CData块,而代码中的解析逻辑无法正确处理CData块。为了解决这个问题,需要将XML中的CData块删除,并使用下面的XML进行解析:



    87
    
        
            
                
                    
                        
                        
                        0
                        0
                        4
                        0
                        Something was wrong
                        Foo Data
                    
                
            
        
    

然后使用下面的XML Linq进行解析:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            XDocument doc = XDocument.Parse(xml);
            Dictionary dict = doc.Descendants().Where(x => x.Name.LocalName == "return")
                .FirstOrDefault().Elements().Where(x => (string)x != string.Empty)
                .GroupBy(x => x.Name.LocalName, y => (string)y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        }
    }
}

感谢回复!我有一些问题:1. XML是否可以有CData标签?是否合法?2.你能显示删除CData的方法吗?我无法手动删除它们。

答:是的,CData是允许的,但是不能包含XML标签,并且不能在另一个缩进行内包含第二个XML标签。

0
0 Comments

问题的出现原因是忘记了命名空间,需要使用XmlNamespaceManager来添加命名空间。另外,需要将XML分为两部分,一个是CDATA之前的部分,另一个是CDATA之后的部分。

解决方法是使用XmlNamespaceManager来添加命名空间,并将XML分为两个子XML。修改代码如下:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
mgr.AddNamespace("S", "http://schemas.xmlsoap.org/soap/envelope/");
mgr.AddNamespace("ns2", "http://service.one.com/");
mgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
var infoReply = xmlDoc.SelectSingleNode("//GetReply/InfoReply", mgr);
XmlDocument requestDocument = new XmlDocument();
requestDocument.LoadXml(infoReply.InnerText);
var errorMessageNode = requestDocument.SelectSingleNode("/S:Container/S:Body/ns2:getReference31IPOResponse/return/errorMessage", mgr);
string errorMessage = errorMessageNode?.InnerText;

希望这能帮到你。你真棒!非常感谢!祝你有愉快的一天!太棒了!谢谢!:)

0