Mat*_*ell 20 .net xml-serialization .net-2.0
我正在尝试生成这样的XML:
<?xml version="1.0"?>
<!DOCTYPE APIRequest SYSTEM
"https://url">
<APIRequest>
<Head>
<Key>123</Key>
</Head>
<ObjectClass>
<Field>Value</Field
</ObjectClass>
</APIRequest>
Run Code Online (Sandbox Code Playgroud)
我有一个用XMLSerialization属性装饰的类(ObjectClass),如下所示:
[XmlRoot("ObjectClass")]
public class ObjectClass
{
[XmlElement("Field")]
public string Field { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而我真正的hacky直觉思想让我的工作就是在序列化时这样做:
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>");
Run Code Online (Sandbox Code Playgroud)
但是,这会生成如下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>
Run Code Online (Sandbox Code Playgroud)
即serialize语句自动添加<?xml文本声明.
我知道我正在攻击这个错误,所以有人能指出我正确的方向吗?
作为一个注释,我认为只使用一个带有ObjectClass的APIRequest类来实现它是否具有实际意义(因为有20种不同类型的ObjectClass,每个都需要这个样板文件)但如果我是正确的话,请纠正我错误.
小智 31
试试这个:
internal static string ToXml(object obj)
{
string retval = null;
if (obj != null)
{
StringBuilder sb = new StringBuilder();
using(XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true }))
{
new XmlSerializer(obj.GetType()).Serialize(writer, obj);
}
retval = sb.ToString();
}
return retval;
}
Run Code Online (Sandbox Code Playgroud)
sis*_*sve 24
永远不要使用字符串连接来构建xml.这是邪恶的.
输出:
<?xml version="1.0" encoding="utf-16"?>
<!DOCTYPE APIRequest SYSTEM "https://url">
<APIRequest>
<Head>
<Key>123</Key>
</Head>
<ObjectClass>
<Field>Value</Field>
</ObjectClass>
</APIRequest>
Run Code Online (Sandbox Code Playgroud)
码:
using System;
using System.Diagnostics;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public static class Program {
public static void Main() {
var obj = new ObjectClass { Field = "Value" };
var settings = new XmlWriterSettings {
Indent = true
};
var xml = new StringBuilder();
using (var writer = XmlWriter.Create(xml, settings)) {
Debug.Assert(writer != null);
writer.WriteDocType("APIRequest", null, "https://url", null);
writer.WriteStartElement("APIRequest");
writer.WriteStartElement("Head");
writer.WriteElementString("Key", "123");
writer.WriteEndElement(); // </Head>
var nsSerializer = new XmlSerializerNamespaces();
nsSerializer.Add("", "");
var xmlSerializer = new XmlSerializer(obj.GetType(), "");
xmlSerializer.Serialize(writer, obj, nsSerializer);
writer.WriteEndElement(); // </APIRequest>
}
Console.WriteLine(xml.ToString());
Console.ReadLine();
}
}
[XmlRoot("ObjectClass")]
public class ObjectClass {
[XmlElement("Field")]
public string Field { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27708 次 |
| 最近记录: |