我有一个简单的 .NET Web 服务,它应该返回一个字符串值。它创建一个 DataSet 并返回 GetXml() 方法,如下所示:
[WebMethod]
public string GetOpenIssues(string CustomerCode, string LocationShortName)
{
DAL.EncodedConnectionString = ConfigurationManager.ConnectionStrings["EncodedConnectionString"].ConnectionString;
System.Data.SqlClient.SqlCommand sc = new System.Data.SqlClient.SqlCommand("GetOpenIssues");
sc.Parameters.AddWithValue("CustomerCode", CustomerCode);
sc.Parameters.AddWithValue("LocationShortName", LocationShortName);
return DAL.SPDataSet(sc, "OpenIssues").GetXml();
}
问题是当我从另一个程序调用此 Web 服务或在 Debug模式下运行它并查看结果时,它会给我以下信息:
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="RemoteWebService"><OpenIssues> <Table> <IssueID>15351</IssueID> <IssueSummary>Computer keeps crashing. This continues to be a problem</IssueSummary> <LocationName>West Side</LocationName> <Status>WIP</Status> <CustomerID>89755</CustomerID> <CustomerName>West Side Computers</CustomerName> <CustomerShortName>WSC</CustomerShortName> <Notes /> <STATUS1>Work In Progress</STATUS1> <SubmittedBy>WSC - Tom Johns</SubmittedBy> <EQ_Replaced>true</EQ_Replaced></Table> </OpenIssues></string>
如您所知,格式不正确。出于某种原因,它在每个元素之间放置了空格。
关于我做错了什么有什么想法吗?我想要做的就是返回此结果的 xml,以便我可以在其他不是用 .NET 编写的内部应用程序中使用它。
更新 感谢您的回复,但我认为格式是一个问题,这就是原因。我正在编写一个使用此 Web 服务的 Android 应用程序。我可以很好地连接和检索 xml 字符串,但是当我尝试解析它时,由于字符串中的额外空间,它错过了节点。为了进一步确认这一点,如果我直接从 Web 服务 URL 复制并粘贴输出到一个空文件中,将其另存为 .xml 并尝试查看它,它不会打开。另外,当我尝试右键单击 Web 服务输出页面以“查看源代码”时,它说此时无法查看。但是,当我使用格式正确的 xml 字符串时,我可以在浏览器中查看它并查看源代码。
不太确定在这里还能说什么....我们已经在 Android/Java 方面做了很多故障排除,这里 StackOverflow Android Question当我们使用上述格式的 XML(意味着其中有额外的空格)时,解析器不会选取 IssueSummary 元素。但是,如果我手动删除空格并将应用程序指向新文件(而不是 Web 服务),那么它会找到 IssueSummary 元素并正常显示数据。这不会让您相信它与节点之间的空间有关吗?
更新 #2 - 解决方案
在挖掘和挖掘之后,我找到了一个解决方案。我们的网络方法使用 .GetXml() 返回上面的 Xml,每个节点之间有空格。我和我的同事对 Web 服务进行了多项尝试,发现如果我们使用 XmlDocument 并改为调用 InnerXml 属性,它会返回不带这些空格的 xml:
[WebMethod]
public string GetOpenIssues(string CustomerCode, string LocationShortName)
{
DAL.EncodedConnectionString = ConfigurationManager.ConnectionStrings["EncodedConnectionString"].ConnectionString;
System.Data.SqlClient.SqlCommand sc = new System.Data.SqlClient.SqlCommand("GetOpenIssuesSite");
sc.Parameters.AddWithValue("CustomerCode", CustomerCode);
sc.Parameters.AddWithValue("ICAO", LocationShortName);
System.Data.DataSet ds = DAL.SPDataSet(sc, "OpenIssues");
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
System.IO.StringWriter sw = new System.IO.StringWriter();
ds.WriteXml(sw);
doc.LoadXml(sw.ToString());
return doc.InnerXml;
}
一旦我们这样做了,另一端(Android 应用程序)的解析器就可以完美地处理它。因此,使用 XmlDocument 的 .InnerXml 而不是 DataSet 的 .GetXml() 似乎更安全。
感谢那些帮助过的人,非常感谢!
最佳答案
我认为格式很简单。无论它们之间是否有空格,xml 解析器都会将文档解析为 xml。调用函数,获取 xml,xml reader 处理 xml。也许文档本身有一个空格。
关于c# - .NET Web 服务返回无效的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201735/