You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XDocument.Load读取长SOAP XML报UriFormatException错误如何解决

错误原因
  • 核心错误来自XDocument.Load方法的误用:XDocument.Load()的入参默认会被识别为URI/本地文件路径,你将完整的XML内容字符串直接传入该方法时,程序会尝试把超长的XML内容解析为URI,而URI长度存在系统级限制(通常最大为几千字符),你的2万多行XML远超该限制,因此抛出System.UriFormatException异常。
  • 除此之外,你的查询代码还存在两处额外问题:
    1. 调用.Elements("<PlantForecastIntervalNode>")时参数额外加了尖括号,不符合方法入参要求
    2. 报文中的XML节点都绑定了不同的命名空间,直接写节点名无法命中目标节点,查询结果会为空
    3. 直接对IEnumerable类型的ids执行Console.WriteLine只会输出类型名称,无法输出实际的查询值
解决方法
  1. 替换加载方法:使用XDocument.Parse()替代XDocument.Load(),该方法专门用于直接解析XML格式的字符串内容。
  2. 修正查询参数:去掉元素名前后的尖括号,填写纯节点名称。
  3. 补充命名空间处理:按照报文中的命名空间声明,在查询时指定对应命名空间。
  4. 遍历输出查询结果。

修正后的代码示例:

// 加载XML字符串用Parse,不要用Load
XDocument xdoc = XDocument.Parse(soapmessage);

// 声明对应命名空间
XNamespace nsBase = "http://base.datacontract";
XNamespace nsSolar = "LSS.solar.webservice";

// 按照节点层级+命名空间查询
var ids = xdoc.Descendants(nsSolar + "FourMonthsAhead1Result")
    .Elements(nsBase + "PlantForecastIntervals")
    .Elements(nsBase + "PlantForecastIntervalNode")
    .Select(item => item.Element(nsBase + "IntervalStartTime").Value);

// 遍历输出所有时间值
foreach (var id in ids)
{
    Console.WriteLine(id);
}

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:27:02