没有 的 .NET XML 序列化 文字声明
我正在尝试生成这样的 XML:
<?xml version="1.0"?>
<!DOCTYPE APIRequest SYSTEM
"https://url">
<APIRequest>
<Head>
<Key>123</Key>
</Head>
<ObjectClass>
<Field>Value</Field
</ObjectClass>
</APIRequest>
我有一个用 XMLSerialization 属性装饰的类(ObjectClass),如下所示:
[XmlRoot("ObjectClass")]
public class ObjectClass
{
[XmlElement("Field")]
public string Field { get; set; }
}
我真正的黑客直观想法是在序列化时执行此操作:
ObjectClass inst = new ObjectClass();
XmlSerializer serializer = new XmlSerializer(inst.GetType(), "");
StringWriter w = new StringWriter();
w.WriteLine(@"<?xml version=""1.0""?>");
w.WriteLine("<!DOCTYPE APIRequest SYSTEM");
w.WriteLine(@"""https://url"">");
w.WriteLine("<APIRequest>");
w.WriteLine("<Head>");
w.WriteLine(@"<Field>Value</Field>");
w.WriteLine(@"</Head>");
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.Serialize(w, inst, ns);
w.WriteLine("</APIRequest>");
但是,这会生成这样的 XML :
<?xml version="1.0"?>
<!DOCTYPE APIRequest SYSTEM
"https://url">
<APIRequest>
<Head>
<Key>123</Key>
</Head>
<?xml version="1.0" encoding="utf-16"?>
<ObjectClass>
<Field>Value</Field>
</ObjectClass>
</APIRequest>
即序列化语句自动添加
我知道我的攻击是错误的,所以有人可以指出我正确的方向吗?
需要注意的是,我认为仅仅创建一个包含 ObjectClass 的 APIRequest 类没有实际意义(因为据说有 20 种不同类型的 ObjectClass,每种类型都需要这个样板),但如果我是这样,请纠正我错误的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
尝试这个:
try this:
切勿使用字符串连接来构建 xml。 这是邪恶的。
输出:
代码:
Never build xml using string concatenation. It's evil.
Output:
Code:
如果您出于性能原因不想依赖 xml 编写器,您可以这样做:
sr.ReadToEnd().ToString() 现在包含裸序列化
If you don't want to rely on an xml writer for performance reasons etc you can do this:
sr.ReadToEnd().ToString() now contains the naked serialization
派生您自己的 XmlTextWriter 以省略 XML 声明。
使用派生的 MyXmlTextWriter 的实例调用 Serialize。
Derive your own XmlTextWriter to omit the XML declaration.
Call Serialize with an instance of the derived MyXmlTextWriter.
Scott Hanselman 对此发表了一篇很好的文章。 我不久前使用 Kzu 的例子(Scott 的博客指出)来做同样的事情,效果很好。
Scott Hanselman's got a good post on this. I used Kzu's example (which Scott's blog points to) a while back for the same thing and it worked great.
一个衬垫,从字符串中删除第一行:
不优雅,但简洁。
One liner, to remove the first line from a string:
Not elegant, but concise.