【问题标题】:.NET web service returning invalid xml.NET Web 服务返回无效的 xml
【发布时间】: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


【解决方案1】:

我认为格式是微不足道的。无论文档之间是否有空格,xml 解析器都会将文档解析为 xml。调用函数,获取 xml,xml reader 处理 xml。也许文档本身有一个空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多