0

我通常在网上搜索我的答案,但这次我画的是空白。我正在使用 VS2005 编写代码以将 xml 发布到 API。我在 C# 中设置了类,并将其序列化为 XML 文档。课程如下:

[Serializable]
    [XmlRoot(Namespace = "", IsNullable = false)]
    public class Request
    {
        public RequestIdentify Identify;

        public string Method;

        public string Params;

    }

    [Serializable]
    public class RequestIdentify
    {
        public string StoreId;

        public string Password;
    }

当我序列化这个时,我得到:

<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Identify>
      <StoreId>00</StoreId>
      <Password>removed for security</Password>
   </Identify>
   <Method>ProductExport</Method>
   <Params />
</Request>

但 API 返回“未发送 XML”错误。

如果我直接以字符串形式发送 xml:

string xml = @"<Request><Identify><StoreId>00</StoreId><Password>Removed for security</Password></Identify><Method>ProductExport</Method><Params /></Request>";

有效地发送此 xml(“请求”标签中没有架构信息):

<Request>
   <Identify>
      <StoreId>00</StoreId>
      <Password>Removed for security</Password>
   </Identify>
   <Method>ProductExport</Method>
   <Params />
</Request>

看来识别XML没问题。

所以我想我的问题是如何将我当前的类更改为序列化为 XML 并像第二种情况一样获取 XML?我假设我需要另一个“父”类来包装现有的类,并在这个“父”或类似的东西上使用 InnerXml 属性,但我不知道该怎么做。

为这个问题道歉,我只使用 C# 3 个月,我是一名实习开发人员,必须在工作中自学!

哦,PS我不知道为什么,但是VS2005真的不想让我用私有变量设置这些类,然后在公共等价物上使用getter和setter,所以我现在让它们写出来。

提前致谢 :-)

更新:

与大多数事情一样,如果您不确定需要问什么或如何措辞,则很难找到答案,但是:

一旦我知道要寻找什么,我就找到了我需要的答案:

删除 XML 声明:

XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
StringWriter stringWriter = new StringWriter();
using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, writerSettings))
{
    serializer.Serialize(xmlWriter, request);
}
string xmlText = stringWriter.ToString();

删除/设置命名空间(感谢上面帮助找到这个的回复!):

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

感谢所有回答或指出我正确方向的人的帮助!是的,一旦我知道自己在问什么,我确实找到了要阅读的文章 :-) 这是我自学 3 个月以来第一次陷入困境,所以我认为我做得很好......

4

1 回答 1

0

来自 Rydal 的博客:

默认情况下,XmlDocument 对象将命名空间分配给 XML 字符串,并且还包括声明作为 XML 文档的第一行。我绝对不需要或使用这些,因此,我需要删除它们。这就是你如何去做。

从 XML 序列化中删除声明和命名空间

于 2012-06-26T13:01:55.120 回答