c# - .NET Web 服务返回无效的 XML

标签 c# .net web-services

我有一个简单的 .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/

相关文章:

c# - 将值从变量替换为另一个值

c# - 如何管理Windows Azure SQL数据库

c# - 防止继承的TabControl创建TabPages

.net - 如何检查文件名是否与通配符模式匹配?

php - php Web服务示例

javascript - 我如何知道服务器上数据库的主机名是什么

c# - 分割自相交多边形的算法

c# - 以 json 格式而不是纯 html 从 aspx 页面获取响应

.net - 提取字符串 foo : with regex 之后的数字

java - 如何在jsp页面中调用web服务