从XML序列化的阵列中删除包装元素 [英] Removing Wrapper Elements from XML-Serialized Array
问题描述
我使用VSTS2008 + C#+ .NET 3.0。我使用低于code序列化XML和我对象包含数组类型的属性,但也有一些其他元素的图层(在我的样本,MyInnerObject和myObject的)产生的,我想从生成的XML文件中删除。任何想法?
目前生成的XML文件,
< XML版本=1.0&GT?;
< MyClass的的xmlns:XSI =http://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =http://www.w3.org/2001/XMLSchema>
< MyObjectProperty>
<为MyObject>
< MyInnerObjectProperty>
< MyInnerObject>
<的ObjectName>富类型< /的ObjectName>
< / MyInnerObject>
< / MyInnerObjectProperty>
< /为MyObject>
< / MyObjectProperty>
< / MyClass的>
预计XML文件,
< XML版本=1.0&GT?;
< MyClass的的xmlns:XSI =http://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =http://www.w3.org/2001/XMLSchema>
< MyObjectProperty>
< MyInnerObjectProperty>
<的ObjectName>富类型< /的ObjectName>
< / MyInnerObjectProperty>
< / MyObjectProperty>
< / MyClass的>
目前的code,
公共类MyClass的
{
私人为MyObject [] _myObjectProperty;
[XmlArrayItemAttribute(ISNULLABLE = FALSE)]
公众为MyObject [] MyObjectProperty
{
得到
{
返回_myObjectProperty;
}
组
{
_myObjectProperty =价值;
}
}
}
公共类为MyObject
{
私人MyInnerObject [] _myInnerObjectProperty;
[XmlArrayItemAttribute(ISNULLABLE = FALSE)]
公共MyInnerObject [] MyInnerObjectProperty
{
得到
{
返回_myInnerObjectProperty;
}
组
{
_myInnerObjectProperty =价值;
}
}
}
公共类MyInnerObject
{
公共字符串的ObjectName;
}
公共类节目
{
静态无效的主要(字串[] args)
{
XmlSerializer的S =新的XmlSerializer(typeof运算(MyClass的));
的FileStream FS =新的FileStream(foo.xml,FileMode.Create);
MyClass的实例=新MyClass的();
instance.MyObjectProperty =新MyObject的[1];
instance.MyObjectProperty [0] =新的MyObject();
instance.MyObjectProperty [0] .MyInnerObjectProperty =新MyInnerObject [1];
instance.MyObjectProperty [0] .MyInnerObjectProperty [0] =新MyInnerObject();
instance.MyObjectProperty [0] .MyInnerObjectProperty [0] .ObjectName =富型;
s.Serialize(FS,实例);
返回;
}
}
而不是
[XmlArrayItemAttribute]
使用:
[的XmlElement]
要弄清楚这一点,在未来,你可以运行(从VS命令提示符):
XSD.EXE的test.xml
XSD.EXE /类test.xsd
这会产生test.cs中,包含XML序列化的类,基于XML。如果你有一个的.xsd各地ofcourse这工作更好
I am using VSTS2008 + C# + .Net 3.0. I am using below code to serialize XML, and my object contains array type property, but there some additional elements' layer (in my sample, MyInnerObject and MyObject) generated which I want to remove from the generated XML file. Any ideas?
Current generated XML file,
<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MyObjectProperty>
<MyObject>
<MyInnerObjectProperty>
<MyInnerObject>
<ObjectName>Foo Type</ObjectName>
</MyInnerObject>
</MyInnerObjectProperty>
</MyObject>
</MyObjectProperty>
</MyClass>
Expected XML file,
<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MyObjectProperty>
<MyInnerObjectProperty>
<ObjectName>Foo Type</ObjectName>
</MyInnerObjectProperty>
</MyObjectProperty>
</MyClass>
Current code,
public class MyClass
{
private MyObject[] _myObjectProperty;
[XmlArrayItemAttribute(IsNullable=false)]
public MyObject[] MyObjectProperty
{
get
{
return _myObjectProperty;
}
set
{
_myObjectProperty = value;
}
}
}
public class MyObject
{
private MyInnerObject[] _myInnerObjectProperty;
[XmlArrayItemAttribute(IsNullable = false)]
public MyInnerObject[] MyInnerObjectProperty
{
get
{
return _myInnerObjectProperty;
}
set
{
_myInnerObjectProperty = value;
}
}
}
public class MyInnerObject
{
public string ObjectName;
}
public class Program
{
static void Main(string[] args)
{
XmlSerializer s = new XmlSerializer(typeof(MyClass));
FileStream fs = new FileStream("foo.xml", FileMode.Create);
MyClass instance = new MyClass();
instance.MyObjectProperty = new MyObject[1];
instance.MyObjectProperty[0] = new MyObject();
instance.MyObjectProperty[0].MyInnerObjectProperty = new MyInnerObject[1];
instance.MyObjectProperty[0].MyInnerObjectProperty[0] = new MyInnerObject();
instance.MyObjectProperty[0].MyInnerObjectProperty[0].ObjectName = "Foo Type";
s.Serialize(fs, instance);
return;
}
}
Instead of
[XmlArrayItemAttribute]
use:
[XmlElement]
To figure this out in the future, you can run (from a VS Command Prompt):
xsd.exe test.xml
xsd.exe /classes test.xsd
This generates test.cs, that contains the xml serializable class, based on the xml. This works even better if you have an .xsd around ofcourse
这篇关于从XML序列化的阵列中删除包装元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!