C# 来自HTTP响应的XML格式

C# 来自HTTP响应的XML格式,c#,asp.net,xml,parsing,httpresponse,C#,Asp.net,Xml,Parsing,Httpresponse,我正在使用一些asp.net/c#和一些我发布的HP ILO脚本,然后我得到一个repsonse(应该是XML) 不幸的是,由于错误,如果XML格式不正确,则无法使用XML解析器进行响应 以下是一个示例输出: IP Address is: 10.3.3.1 <?xml version="1.0"?> <RIBCL VERSION="2.22"> <RESPONSE STATUS="0x0000" MESSAGE='No err

我正在使用一些asp.net/c#和一些我发布的HP ILO脚本,然后我得到一个repsonse(应该是XML)

不幸的是,由于错误,如果XML格式不正确,则无法使用XML解析器进行响应

以下是一个示例输出:

IP Address is: 10.3.3.1
<?xml version="1.0"?>
<RIBCL VERSION="2.22">
    <RESPONSE
        STATUS="0x0000"
        MESSAGE='No error'
     />
    <INFORM>Scripting utility should be updated to the latest version.</INFORM>
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.22">
    <RESPONSE
        STATUS="0x0000"
        MESSAGE='No error'
     />
</RIBCL>
<GET_EMBEDDED_HEALTH_DATA>
    <FANS>
        <FAN>...
IP地址为:10.3.3.1
脚本实用程序应更新至最新版本。
...
因此,我关心的数据都在
中,如果我删除了不正确的语法,XML解析器就可以很好地使用这些数据

我的问题是如何提取/格式化我需要的数据? 我知道我可能会将不正确的xml响应保存到一个文本文件中,格式化它,然后用xml解析它,但是有更好/更快的方法吗


连续运行100次也需要很长时间。

从上面所示,XML部分本身格式良好,但文本包含多个XML声明和多个根。这些是唯一的问题,还是其他地方确实存在坏XML

如果这些是唯一的问题,那么类似的方法可能会奏效:

string declarationsRemoved = output.Replace("<?xml version=\"1.0\"?>", "");

XmlDocument doc = new XmlDocument();
doc.LoadXml("<root>" + declarationsRemoved + "</root>");

XmlNode healthData = doc.SelectSingleNode("/root/GET_EMBEDDED_HEALTH_DATA");
string declarationsRemoved=output.Replace(“,”);
XmlDocument doc=新的XmlDocument();
doc.LoadXml(“+declarationsRemoved+”);
XmlNode healthData=doc.SelectSingleNode(“/root/GET_EMBEDDED_HEALTH_DATA”);
或者,您可以使用正则表达式提取所需的部分:

string healthDataXml = Regex.Match(output, 
    "<GET_EMBEDDED_HEALTH_DATA>.*</GET_EMBEDDED_HEALTH_DATA>", RegexOptions.Singleline).ToString();
string healthDataXml=Regex.Match(输出,
“*”,RegexOptions.Singleline).ToString();

是否无法从根本上解决问题?看起来好像有人忘记了调试消息是的,我已经想到了,但唯一的办法是让HP ILO开发人员为我做这件事,这是不会发生的。另一种方法是将XML解析为文本并处理字符串操作,但这太容易出错。是的,多个根是一个问题(运行多个脚本,所有脚本都给出自己的根)但是,在repsonse的开头也有正常的文本,例如
IP地址是:10.3.3.1
,在结尾也有类似的内容。正则表达式也是一个好主意,但它似乎没有拾取
标记,因为它们从响应stirng返回转义字符,例如
\t\r\n\t
。如何解释
IP地址是:10.3.3.1
部分对于第一种方法来说应该不是问题,只要您将其包装在开始和结束标记中,如我上面所示。唯一的情况是,如果额外的文本包含<或-,则会出现问题。我认为正则表达式不起作用的原因可能是您试图提取的部分跨越多行,在这种情况下,您需要使用RegexOptions.Singleline选项。我已经相应地修改了上面的代码。你是对的。在RegExceptions之后。单线运行很好。再次感谢:)