【发布时间】:2012-02-08 21:30:04
【问题描述】:
我有一个简单的 .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 服务或在调试模式下运行它并查看结果时,它给了我以下信息:
<?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 - 分辨率
在挖掘和挖掘之后,我能够找出解决方案。我们的 web 方法使用 .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() 似乎更安全。
感谢帮助过的人,非常感谢!
【问题讨论】:
-
是否有某种格式属性可以设置/调用
-
那些空格应该是无关紧要的。您在导入它时遇到实际问题吗?如果是这样,请发布该部分的详细信息,以及完整的错误消息等。
-
@Robert,“invalid xml”表示不符合 XML 规范的文本(在这种情况下不是这样),到目前为止,您的问题是“我不喜欢有效 XML 的格式" - 需要更多细节。
-
更新后,我们仍然需要更多关于“尝试查看它,它没有打开”等详细信息。它是有效的xml。您可能使用了错误的编码或...许多其他可能性。
-
@Henk - 当我说“尝试查看”时,我的意思是实际上尝试在浏览器中打开文件。
标签: c# .net web-services