【问题标题】:Returning XML natively in a .NET (C#) webservice?在 .NET (C#) Web 服务中本机返回 XML?
【发布时间】:2009-01-30 16:44:03
【问题描述】:

我意识到 .NET 中的 SOAP Web 服务会返回 Web 方法返回的任何对象的 XML 表示,但是如果我想以 XML 格式返回数据格式,那么存储它的最佳对象是什么?

我正在使用answerthis question 来编写我的XML,这里是代码:

XmlWriter writer = XmlWriter.Create(pathToOutput);
writer.WriteStartDocument();
writer.WriteStartElement("People");

writer.WriteStartElement("Person");
writer.WriteAttributeString("Name", "Nick");
writer.WriteEndElement();

writer.WriteStartElement("Person");
writer.WriteStartAttribute("Name");
writer.WriteValue("Nick");
writer.WriteEndAttribute();
writer.WriteEndElement();

writer.WriteEndElement();
writer.WriteEndDocument();

writer.Flush();

现在我可以将此输出作为字符串返回给我的调用 web 方法,但它显示为 <string> XML HERE </string>,无论如何只返回完整的 xml 吗?

请在您的回答中举例说明如何将所述对象与 XmlWriter 或另一个内部对象一起使用(如果您认为 XmlWriter 是一个糟糕的选择)。 System.Xml 包(命名空间)有很多对象,但我无法找到关于如何一起使用这些对象或在什么情况下使用什么的合适文档。

【问题讨论】:

    标签: c# .net xml web-services


    【解决方案1】:

    这就是我最终的做法;

    StringBuilder sb = new StringBuilder();
    XmlWriter writer = XmlWriter.Create(sb, settings);
    
    writer.WriteStartDocument();
    writer.WriteStartElement("People");
    
    writer.WriteStartElement("Person");
    writer.WriteAttributeString("Name", "Nick");
    writer.WriteEndElement();
    
    writer.WriteStartElement("Person");
    writer.WriteStartAttribute("Name");
    writer.WriteValue("Nick");
    writer.WriteEndAttribute();
    writer.WriteEndElement();
    
    writer.WriteEndElement();
    writer.WriteEndDocument();
    
    writer.Flush();
    
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.LoadXml(sb.ToString());
    return xmlDocument;
    

    可能不是最好的方法,但它似乎有效。如果您有更好的方法,请告诉我。谢谢。

    【讨论】:

    • 您可能希望将 XmlWriter 包装在 using 语句中: using(XmlWriter writer = XmlWriter.Create(sb, settings)) { build xml and return xmldocument }
    • 它实际上是由 web 方法调用的方法,因此希望 CLR 能够有效地进行垃圾收集。感谢您的所有帮助,Kev。
    • 还有一点需要注意的是,如果您在您的 Web 服务中添加 Web 引用(如果您的客户端基于 .NET),则生成的 WS 代理代码将返回 XmlNode,而不是 XmlDocument。只是让你知道。 :)
    • 嗯,有趣的是,我实际上是通过 Java 使用服务的。这也带来了一些有趣的挑战。
    • ...XmlDocument 无论如何都是从 XmlNode 派生的,因此在使用 XPath 查询 xml 或创建 XPathNavigators 等功能方面没有太大困难。
    【解决方案2】:

    只需返回一个 XmlDocument。例如

    [WebMethod]
    public XmlDocument Quux()
    {
    
    }
    

    【讨论】:

    • 是的,我正在调查,但我不明白 XmlWriter 如何与 XmlDocument 交互。
    • 这是系统的故障,您的答案不是我想要的(尽管我的问题是我的问题不够清楚,我更正了)所以我投了反对票。但我可以看到你积极地试图提供帮助,所以我删除了反对票。系统需要一种说法……
    • 感谢您提供帮助,但这不是我想要的答案。
    【解决方案3】:

    XmlElement,而不是 XmlDocument。

    Return an XmlElement

    【讨论】:

    • 明确说明您返回的是片段,而不是完整的文档。例如,没有声明。等等。
    【解决方案4】:

    您可以有一个代表您的 XML 的类并返回该类,或者也可以在 XMLNode 中返回您的 xml

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2012-04-05
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多