XmlDocument.Load 加载多个根元素

4

大家好,我遇到了一个问题,需要加载XML文件。

我的代码如下:

Stream.Seek(0, SeekOrigin.Begin);
xmlDoc.Load(Stream); //--> throw XmlException (multiple root elements in 14,22)
xmlDoc.PreserveWhitespace = true;

XML文件是什么?

<soapenv:Envelope xmlns:dummy="

http://www.somedomian.com/dummybus/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header Id="IDH">
        <dummy:authentication>
            <id>Unique</id>
            <userid>myuser</userid>
        </dummy:authentication>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsu:Timestamp>
                <wsu:Created>2015-09-07T12:21:15</wsu:Created>
                <wsu:Expires>2015-09-08T12:21:15</wsu:Expires>
            </wsu:Timestamp>
        </wsse:Security>
    </soapenv:Header> <!--- This is line 14 and  > is a column 22--->
    <soapenv:Body>
        <dummy:dummybus>
            <msg>X1</msg>
        </dummy:dummybus>
    </soapenv:Body>
</soapenv:Envelope>

<Envelope>标签是文件的根标签,为什么会出现这个错误,我该如何读取我的文件?

我发现了一些有趣的东西

当我保存文件时,它并没有像预期那样完美地加载到流中。

xmlDoc.Load(urlToFile);
xmlDoc.PreserveWhitespace = true;

看起来错误只出现在Stream中,为什么呢?

这个方法将xml字符串转换为MemoryStream。

public class XmlUtil
    {
        public static MemoryStream GenerateStreamFromString(string s)
        {
            MemoryStream stream = new MemoryStream();
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(s);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }

那个“Stream”是从哪里来的?你是如何创建它的? - dbc
@dbc 这是非常罕见的错误,我编辑了帖子,似乎如果从字符串加载,则可以完美运行,如测试所示。 - jasilva
@jasilva - 在发表评论之前,我阅读了您最近的编辑。这就是为什么我在询问“Stream”的来源。 - dbc
@dbc 我发布了新的内容,在看到你对流的评论之前进行了编辑。 - jasilva
尝试明确使用Utf8编码,并在写入MemoryStream时禁用(或启用)BOM:参见https://dev59.com/KHE95IYBdhLWcg3wI6jt - dbc
显示剩余6条评论
1个回答

0

由于您正在从流中读取,我会假设在调用 xmlDoc.Load(Stream) 时它并没有位于开头。在调用之前您对流进行了什么操作?

如果您的流支持寻址,您可以尝试在调用之前将其移回开头:

Stream.Seek(0, SeekOrigin.Begin);
xmlDoc.Load(Stream);

在Load之前,我有这段代码Stream.Seek(0, SeekOrigin.Begin); - jasilva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接