尝试解析XML文件时出现“Root element is missing”异常

时间:2014-06-10 07:33:14

标签: c# xml parsing ksoap2

我试图设置解析在Android中使用kso​​ap2生成的测试XML:

<?xml version="1.0" encoding="utf-8"?>
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header />
    <v:Body>
        <v:SOAPBODY>
            <v:INFO i:type="v:INFO">
                <v:LAITETUNNUS i:type="d:string">EI_TUNNUSTA</v:LAITETUNNUS>
            </v:INFO>
            <v:TOIMINNOT i:type="v:TOIMINNOT">
                <v:TOIMINTA i:type="d:string">ASETUKSET_HAKU</v:TOIMINTA>
            </v:TOIMINNOT>
            <v:SISALTO i:type="v:SISALTO">
                <v:KUVA i:type="d:string">AGFAFDGFDGFG</v:KUVA>
                <v:MITTAUS i:type="d:string">12,42,12,4,53,12</v:MITTAUS>
            </v:SISALTO>
        </v:SOAPBODY>
    </v:Body>
</v:Envelope>

但似乎我无法以任何方式解析它。例外情况始终是&#34;未找到根元素&#34;即使它通过像w3schools那样的XML验证器。如果我正确的话,当问题出现在根元素时,身体的内容不应该成为问题。

我尝试在C#中使用的解析测试代码是:

            using (StreamReader streamreader = new StreamReader(Context.Request.InputStream))
            {
                try
                {
                    XDocument xmlInput = new XDocument();
                    streamreader.BaseStream.Position = 0;
                    string tmp = streamreader.ReadToEnd();
                    var xmlreader = XmlReader.Create(streamreader.BaseStream);
                    xmlInput = XDocument.Parse(tmp);
                    xmlInput = XDocument.Load(xmlreader);
                catch (Exception e)
                { }

xmlInput = XDocument.Parse(tmp);确实将其解析为XDocument,而不是可导航的xmlInput = XDocument.Load(xmlreader);。然后XMLDocument抛出没有根元素的异常。我在这里完全处于亏损状态,因为我之前设法用XDocument"<?xml version=\"1.0\" encoding=\"utf-8\"?><v:Envelope xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\" xmlns:c=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:v=\"http://schemas.xmlsoap.org/soap/envelope/\"><v:Header /><v:Body><v:SOAPBODY><v:INFO i:type=\"v:INFO\"><v:LAITETUNNUS i:type=\"d:string\">EI_TUNNUSTA</v:LAITETUNNUS></v:INFO><v:TOIMINNOT i:type=\"v:TOIMINNOT\"><v:TOIMINTA i:type=\"d:string\">ASETUKSET_HAKU</v:TOIMINTA></v:TOIMINNOT><v:SISALTO i:type=\"v:SISALTO\"><v:KUVA i:type=\"d:string\">AGFAFDGFDGFG</v:KUVA><v:MITTAUS i:type=\"d:string\">12,42,12,4,53,12</v:MITTAUS></v:SISALTO></v:SOAPBODY></v:Body></v:Envelope>\r\n" 类来解析和导航几乎相同的xml,我担心我做了一些我没有注意到的变化。

提前致谢。

更新:这里是请求的字符串tmp:

XDocument.Load(new StreamReader(Context.Request.InputStream, Encoding.UTF8)); the parsing will fail.

更新:即使使用{{1}}

1 个答案:

答案 0 :(得分:0)

我相信您已经读过流的末尾,您需要再次重置流中的位置。见:"Root element is missing" error but I have a root element