我如何解析这个XML(没有得到"根元素丢失"或"序列不包含元素")?

B. *_*non 9 c# linq-to-xml frombodyattribute

这是这个问题的一个分支为什么在"穿越Rubicon"之后HttpWebRequest主体为val?这回答了(一个障碍是跳过),但是下一个障碍让我兴奋起来.

使用此代码:

public async void PostArgsAndXMLFileAsStr([FromBody] string stringifiedXML, string serialNum, string siteNum)
{
    XDocument doc = XDocument.Parse(await Request.Content.ReadAsStringAsync()); 
Run Code Online (Sandbox Code Playgroud)

...或这个:

XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
Run Code Online (Sandbox Code Playgroud)

...这是作为传入的stringifiedXML:

<?xml version=1.0?>
<LocateAndLaunch>
    <Tasks>Some Task</Tasks>
    <Locations>Some Location</Locations>
</LocateAndLaunch>
Run Code Online (Sandbox Code Playgroud)

...我得到异常:" System.Xml.XmlException未被用户代码处理HResult = -2146232000 Message = Root元素丢失. "

使用此代码(相同的stringifiedXML):

XDocument doc = XDocument.Parse(stringifiedXML);
Run Code Online (Sandbox Code Playgroud)

我明白了

System.InvalidOperationException未被用户代码处理HResult = -2146233079 Message = Sequence不包含任何元素Source = System.Core StackTrace:在System.Linq.Enumerable.First [TSource](IEnumerable`1 source)at HandheldServer.Controllers.DeliveryItemsController.d__2 .MoveNext()在c:\ HandheldServer\HandheldServer\Controllers\DeliveryItemsController.cs:第109行InnerException:

IOW,取决于我如何解析传入的字符串,我得到" 根元素丢失 "或" 序列不包含元素 "

Deuce McAlistair MacLean Virginia Weeper是什么?!?不是<LocateAndLaunch>根元素?不是Some TaskSome Location元素?

我是否需要手动将XML分开而不能使用XDocument或者这样?

注意:来自Fiddler,发送正文数据(XML文本)有效(我发送的内容正如我所希望的那样到达); 但即使这样,服务器上的XML解析代码也会失败.

但是,尝试从手持设备/ Compact Framework客户端代码发送相同的数据只会导致数据通过"="(类似于<xml version="传递给服务器;然后在客户端上,我看到" 此操作无法执行请求提交后 "

UPDATE

所以基于Marcin的答案,似乎我坚持使用XDocument.Parse()我应该没问题,并且根据TToni的回答,data/xml本身可能不好.这是文件的内容:

<?xml version="1.0"?>
<LocateAndLaunch>
    <Tasks>
    </Tasks>
    <Locations>
    </Locations>
</LocateAndLaunch>
Run Code Online (Sandbox Code Playgroud)

所以版本号周围有引号 - 但是我需要以某种方式逃避这些 - 这就是数据被截断的原因 - 因为当它看到第一个引号(在"1.0"之前)时它认为是字符串终止,也许?

更新2

Marcin,传入的"xml"数据(字符串)在它到达XDocument代码之前被截断:

[Route("api/DeliveryItems/PostArgsAndXMLFileAsStr")]
public async void PostArgsAndXMLFileAsStr([FromBody] string stringifiedXML, string serialNum, string siteNum)
{
    string beginningInvoiceNum = string.Empty;
    string endingInvoiceNum = string.Empty;

    //XDocument doc = XDocument.Parse(stringifiedXML);
    //XDocument doc = XDocument.Parse(await Request.Content.ReadAsStringAsync()); 
    XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
Run Code Online (Sandbox Code Playgroud)

更新3

通过使用TToni的建议并用单引号替换双精度:

...我现在将整个字符串放入我的服务器方法:

在此输入图像描述

...但我仍然得到" 缺少根元素 ":

用户代码未处理System.Xml.XmlException HResult = -2146232000消息=缺少根元素.Source = System.Xml LineNumber = 0 LinePosition = 0 SourceUri =""StackTrace:System.Xml.XmlTextReaderImpl.Throw(Exception e),位于System.Xml.Xml.XmlTextReaderImpl.Rempl()处的System.Xml.XmlTextReaderImpl.ParseDocumentContent()处HandheldServer上的System.Xml.Linq.XDocument.Load(Stream stream)上的System.Xml.Linq.XDocument.Load(Stream stream,LoadOptions选项)中的System.Xml.Linq.XDocument.Load(XmlReader reader,LoadOptions选项). Controllers.DeliveryItemsController.d__2.MoveNext()在c:\ HandheldServer\HandheldServer\Controllers\DeliveryItemsController.cs:第66行InnerException:

如果我还没有疯狂,这会让我发疯.事实上,我不知道我在哪里开车.许多雇主正在寻找一个被驱使的人; 也许这就是他们的意思?

更新4

使用这个:

XDocument doc = XDocument.Parse(stringifiedXML);
Run Code Online (Sandbox Code Playgroud)

......而不是这个:

XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
Run Code Online (Sandbox Code Playgroud)

...解决了"根元素缺失"的错误信息; 因此,我将Marcin的答案标记为正确.

Zex*_*ise 10

对于那些通过谷歌找到这个页面的人,但仍然感到困惑.我相信我已经找到了答案,感谢被埋没的MS Post.

它在于使用以下方法将流重置为开头:

xmlStream.Seek(0, SeekOrigin.Begin);
Run Code Online (Sandbox Code Playgroud)

在读取之前没有这个,你基本上开始在流的末尾加载.没有根元素,因为没有更多的流.


Mar*_*zek 6

您提供的示例XML可以正常使用XDocument:

var stringifiedXML = @"<?xml version=""1.0""?>
    <LocateAndLaunch>
        <Tasks>Some Task</Tasks>
        <Locations>Some Location</Locations>
    </LocateAndLaunch>";

XDocument doc = XDocument.Parse(stringifiedXML);

var tasks = (string)doc.Root.Element("Tasks");
var locations = (string)doc.Root.Element("Locations");
Run Code Online (Sandbox Code Playgroud)

所以你的问题是await Request.Content.ReadAsStringAsync(),而不是XDocument.

确保首先ReadAsStringAsync()返回您需要的内容.