XDocument System.UriFormatException:'无效的 URI:Uri 字符串太长

Posted

技术标签:

【中文标题】XDocument System.UriFormatException:\'无效的 URI:Uri 字符串太长【英文标题】:XDocument System.UriFormatException: 'Invalid URI: The Uri string is too longXDocument System.UriFormatException:'无效的 URI:Uri 字符串太长 【发布时间】:2021-11-28 04:29:31 【问题描述】:

我正在尝试读取soapmessage 中的XML。 XML 是 23822 行。 发生System.UriFormatException: 'Invalid URI: The Uri string is too long.' 异常。

下面是读取 XML 响应的代码:

XDocument xdoc = XDocument.Load(soapmessage);

            var ids = xdoc.Element("FourMonthsAhead1Result")
                 .Elements("PlantForecastIntervals")
                 .Elements("<PlantForecastIntervalNode>")
                 .Select(item => item.Element("IntervalStartTime").Value);
            Console.WriteLine(ids);

下面是 XML 响应的小 sn-p:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <s:Body>
        <FourMonthsAhead1Response xmlns="http://tempuri.org/">
            <FourMonthsAhead1Result xmlns="LSS.solar.webservice">
                <PlantDescription xmlns="http://base.datacontract">*PlantName*</PlantDescription>
                <PlantForecastIntervalsCount xmlns="http://base.datacontract">2976</PlantForecastIntervalsCount>
                <ForecastStartDate xmlns="http://base.datacontract">2021-10-08T13:35:55.912612</ForecastStartDate>
                <ForecastEndDate xmlns="http://base.datacontract">2021-10-08T13:35:55.9126123</ForecastEndDate>
                <PlantForecastIntervals xmlns="http://base.datacontract">
                    <PlantForecastIntervalNode>
                        <IntervalStartTime>2021-10-01T00:00:00</IntervalStartTime>
                        <IntervalEndTime>2021-10-01T00:15:00</IntervalEndTime>
                        <IntervalLength>15</IntervalLength>
                        <ForecastResultParameter>FourMonthsAhead1</ForecastResultParameter>
                        <ForecastValue>0</ForecastValue>
                        <ValueUnit>MW</ValueUnit>
                    </PlantForecastIntervalNode>
                    <PlantForecastIntervalNode>
                        <IntervalStartTime>2021-10-01T00:15:00</IntervalStartTime>
                        <IntervalEndTime>2021-10-01T00:30:00</IntervalEndTime>
                        <IntervalLength>15</IntervalLength>
                        <ForecastResultParameter>FourMonthsAhead1</ForecastResultParameter>
                        <ForecastValue>0</ForecastValue>
                        <ValueUnit>MW</ValueUnit>
                    </PlantForecastIntervalNode>
                </PlantForecastIntervals>
            </FourMonthsAhead1Result>
        </FourMonthsAhead1Response>
    </s:Body>
</s:Envelope>

【问题讨论】:

【参考方案1】:

使用XDocument.Parse从内容字符串创建XDocument,而不是XDocument.Load,后者通过指定路径或uri从文件创建XDocument

XDocument xDoc;

string soap = File.ReadAllText("H:\\soap.xml");

// Parse used to get data from a string
xDoc = XDocument.Parse(soap);

// Load can be used to get data from specified file
xDoc = XDocument.Load("H:\\soap.xml");

// Load attempt from string content will throw you an error
xDoc = XDocument.Load(soap); 

【讨论】:

以上是关于XDocument System.UriFormatException:'无效的 URI:Uri 字符串太长的主要内容,如果未能解决你的问题,请参考以下文章

从字符串填充 XDocument

将 XDocument 转换为 XmlDocument,反之亦然

使用 Xdocument 进行简单的 Xml 解析

循环遍历 XDocument 的后代 - C#

如何从 XDocument 获取 XML 节点

为 XDocument 指定默认命名空间会给出空值