没有XML声明的Xml序列化

时间:2012-02-11 18:14:21

标签: c# xml encoding xml-serialization xmlserializer

  

可能重复:
  Serialize into an XML Fragment - not XML Document

我正在尝试从C#类生成XML字符串,但我无法完成我需要的操作。这是我到目前为止所做的。

以下两个类是我的实体:

[Serializable]
[XmlRoot("FooQuery")]
public class Foo
{
    [XmlElement("Prop1")]
    public int MyProperty1 { get; set; }
    [XmlElement("Prop2")]
    public string MyProperty2 { get; set; }
    [XmlElement("Bar", typeof(Bar))]
    public List<Bar> Bar { get; set; }
}

[Serializable]
public class Bar
{
    [XmlElement("Prop1")]
    public int MyProperty1 { get; set; }
    [XmlElement("Prop2")]
    public string MyProperty2 { get; set; }
}

这是我的实施:

static void Main(string[] args)
{
    var foo = new Foo { 
        MyProperty1 = 1,
        MyProperty2 = "FooBar",
        Bar = new List<Bar> { 
            new Bar { MyProperty1 = 1, MyProperty2 = "Foo" },
            new Bar { MyProperty1 = 2, MyProperty2 = "Bar" }
        }
    };

    XmlSerializer serializer = new XmlSerializer(typeof(Foo));
    using (MemoryStream memStream = new MemoryStream()) {

        using (XmlTextWriter xmlWriter = new XmlTextWriter(memStream, Encoding.UTF8)) {
            serializer.Serialize(xmlWriter, foo);
        }

        string xmlQuery;
        xmlQuery = Encoding.UTF8.GetString(memStream.GetBuffer());
        xmlQuery = xmlQuery.Substring(xmlQuery.IndexOf(Convert.ToChar(60)));
        xmlQuery = xmlQuery.Substring(0, (xmlQuery.LastIndexOf(Convert.ToChar(62)) + 1));

        Console.WriteLine(xmlQuery);
    }

}

这是我得到的结果:

<?xml version="1.0" encoding="utf-8" ?> 
<FooQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Prop1>1</Prop1> 
    <Prop2>FooBar</Prop2> 
    <Bar>
        <Prop1>1</Prop1> 
        <Prop2>Foo</Prop2> 
    </Bar>
    <Bar>
        <Prop1>2</Prop1> 
        <Prop2>Bar</Prop2> 
    </Bar>
</FooQuery>

我需要的是摆脱xml版本和编码,如下所示:

<FooQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Prop1>1</Prop1> 
    <Prop2>FooBar</Prop2> 
    <Bar>
        <Prop1>1</Prop1> 
        <Prop2>Foo</Prop2> 
    </Bar>
    <Bar>
        <Prop1>2</Prop1> 
        <Prop2>Bar</Prop2> 
    </Bar>
</FooQuery>
  

这也可以很好地摆脱命名空间,但它并不大   但这对我来说并不是什么大不了的事。

我可以使用String.Replace方法执行此操作,但我认为这是一种肮脏的方法:

xmlQuery.Replace(
    "<?xml version=\"1.0\" encoding=\"utf-8\"?>", 
    string.Empty
);

有什么想法吗?

0 个答案:

没有答案