我正在调用一个返回xml的Web服务。当我需要在json中使用该xml供以后使用时。我可以使用其他Web服务方法。但是当调用特定的Web服务方法并尝试解析它时,我会收到以下错误:
"有多个根元素。第9行,第2行和第34页。
我收到的xml肯定有多个根元素,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Server>
<Name>Abc</Name>
<URL>www.abc.com</URL>
<Env>Windows</Env>
</Server>
<Server>
<Name>XYZ</Name>
<URL>www.xyz.com</URL>
<Env>Linux-Ubuntu</Env>
</Server>
所以基本上我喜欢这个:
XmlDocument doc = new XmlDocument();
doc.LoadXml(response); // response contains the xml shown above
if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
doc.RemoveChild(doc.FirstChild); // Because I want to get rid of the declaration element in the xml.
var resXML = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.Indented, true); // To convert xml into json
return resXML; // Finally return the json.
调试时,它是行doc.LoadXml(响应);它抛出异常的地方。
请记住,这是我从网络服务获取的xml,而不是文件。因此,使用XDocument不会在这里工作。
任何建议,想法??
答案 0 :(得分:2)
嗯,我自己解决了。但是当然,我得到了另一个论坛的帮助,无法了解如何做到这一点。 所以场景实际上是这样的:
我将xml作为来自第三方API的响应(我没有任何控制权)。所以我想将响应封装在一个名为<Servers></Servers>
的根元素中,因此它变为有效的xml,然后我可以使用XmlDocument或XDocument进行解析。
为了解决这个问题,我使用了以下逻辑将其封装在根元素中。
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.ConformanceLevel = ConformanceLevel.Fragment; //We confrom to the fragments because the document will not pass validation due to multiple root elements problem
String xmlString = "<Servers>\n";
using (XmlReader xr = XmlReader.Create(new StringReader(response), xrs))
{
while (xr.Read())
{
if (xr.NodeType != XmlNodeType.XmlDeclaration)
{
switch (xr.NodeType)
{
case XmlNodeType.Element: // If nodetype is an element.
xmlString += "<" + xr.Name + ">";
break;
case XmlNodeType.Text: //Get text inside each element.
xmlString += xr.Value;
break;
case XmlNodeType.EndElement: //Close the element.
xmlString += "</" + xr.Name + ">";
break;
}
}
}
}
xmlString += "</Servers>"; //xmlString now has a string which is a valid xml. So XDocument or XmlDocument parse will not fail over it.
var doc = XDocument.Parse(xmlString);
var json = JsonConvert.SerializeXNode(doc,Newtonsoft.Json.Formatting.Indented, true);
return json; // I convert it to json so the client can consume it.
完成!
当然这是一个解决方法,但是因为API guyes需要时间才能修复无效的xml,所以我必须这样做直到那时。
答案 1 :(得分:0)
在xml中应该有一个<Servers>
标记,您可以在其中放置<Server>
元素。
<?xml version="1.0" encoding="UTF-8"?>
<Servers>
<Server>
<Name>Abc</Name>
<URL>www.abc.com</URL>
<Env>Windows</Env>
</Server>
<Server>
<Name>XYZ</Name>
<URL>www.xyz.com</URL>
<Env>Linux-Ubuntu</Env>
</Server>
</Servers>