我正在使用一些asp.net/c#和一些HP ILO脚本,我发布了POST然后我得到了一个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>...
所以我关心的数据都在<GET_EMBEDDED_HEALTH_DATA>
范围内,如果我删除了错误的语法,它可以与XML解析器一起使用。
我的问题是如何提取/格式化我需要的数据? 我知道我可以将不正确的xml响应保存到文本文件,格式化它,然后xml解析它但是有更好/更快的方法吗?
连续100次运行也需要很长时间。
答案 0 :(得分:2)
从上面的内容可以看出,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 healthDataXml = Regex.Match(output,
"<GET_EMBEDDED_HEALTH_DATA>.*</GET_EMBEDDED_HEALTH_DATA>", RegexOptions.Singleline).ToString();