【发布时间】:2015-07-12 22:07:26
【问题描述】:
我正在尝试为在 Android 中使用 ksoap2 生成的测试 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>
但似乎我无法以任何方式解析它。一个例外总是“找不到根元素”,即使它通过了像 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,我担心我做了一些我没有注意到的更改。
提前致谢。
更新:这是请求的字符串 tmp:
"<?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"
更新:即使XDocument.Load(new StreamReader(Context.Request.InputStream, Encoding.UTF8)); the parsing will fail.
【问题讨论】:
-
我认为这里不需要
StreamReader。只需使用XDocument -
直接解析 xml 对我来说很好(.Net 4.5)。可能是使用错误的编码读取流吗?读完流后能粘贴
tmp的值吗? -
你的样本是....奇怪。网络流通常不可搜索...两次读取流(
ReadToEnd和XmlReader.Create)没有多大意义...您确定这是您遇到问题的代码还是您只是粘贴了多次尝试解析随机排列? -
我认为这是阿列克谢所说的。如果您使用
XDocument.Load(Context.Request.InputStream);而不先将流读入字符串 - 是否仍然会出现错误? -
添加了临时字符串内容。是的,代码可能看起来很愚蠢,因为它有我用来调试和试图弄清楚这一点的行。我也试过 XmlReader xmlReader = XmlReader.Create(Context.Request.InputStream); XDocument xmlinput = XDocument.Load(xmlReader);但它仍然无法解析。