预期的XML输出:
<add>
<doc>
<field name="id">1</field>
<field name="Myname">MyName1</field1>
</doc>
<doc>
<field name="id">2</field>
<field name="Myname">MyName2</field>
</doc>
<doc>
<field name="id">3</field>
<field name="Myname">MyName3</field>
</doc>
</add>
Run Code Online (Sandbox Code Playgroud)
为了获得上述XML文档,我设计了以下类
public class doc
{
[XmlElement("field")]
public ID Id
{
get;
set;
}
[XmlElement("field2")]
public Name Myname
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
名称类将是
public class Name
{
[XmlText]
public string Namevalue
{
get;
set;
}
[XmlAttribute("name")]
public string Myname
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
XmlSerializer代码:
XmlSerializer serializer = new XmlSerializer(typeof(List<doc>), new XmlRootAttribute("add"));
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出
<add>
<doc>
<field name="id">1</field>
<field2 name="Myname">MyName1</field2> …Run Code Online (Sandbox Code Playgroud) 我的问题最好通过一个简单的例子来描述.考虑这样的2个类:
class Order {
[XmlAttribute] int orderId;
[XmlAttribute] int customerId;
List<OrderItem> items;
}
class OrderItem {
[XmlAttribute] int partCode;
[XmlAttribute] int quantity;
}
Run Code Online (Sandbox Code Playgroud)
使用XmlSerializer,这将序列化为这样的:
<order orderId="...", customerId="..." >
<Items>
<orderItem partCode="..." quantity="..." />
</Items>
</order>
Run Code Online (Sandbox Code Playgroud)
我想要做的是删除<Items>级别,以便<orderItem>元素直接在相应的<order>下面
有没有办法做到这一点?
对于某些数据导出,我们正在做的只是使用XmlSerializer序列化.Net对象,如列表或集合.我们使用这样的东西:
public static bool WriteToXMLFile(string fullFileNameWithPath, Object obj, Type ObjectType)
{
TextWriter xr = null;
try
{
XmlSerializer ser = new XmlSerializer(ObjectType);
xr = new StreamWriter(fullFileNameWithPath);
ser.Serialize(xr, obj);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if(xr != null)
xr.Close();
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
对于类型列表,生成的XML类似于以下段:
<ArrayOfMyObjects>
<MyObject>
//content here
</MyObject>
</ArrayOfMyObjects>
Run Code Online (Sandbox Code Playgroud)
但另一方面的期望(这个文件的接收者是这样的:
<MT_MyObjects>
<MyObject>
//content here
</MyObject>
</MT_MyObjects>
Run Code Online (Sandbox Code Playgroud)
那么如何在序列化时将ArrayOfMyObjects更改为MT_MyObjects?我知道也可以使用一些Regx替换来完成.但我希望以后不要触摸输出.
更新:解决方案:
我最终可以像这样解决问题:
[Serializable]
[XmlRoot("MT_LoadProfile")]
public class LoadProfArray : List<LoadProfile>
{
//....
}
Run Code Online (Sandbox Code Playgroud) 我有两个这样的课程:
public class Product
{
public string Name { get; set; }
public int Id { get; set; }
}
public class Category
{
public string CategoryName { get; set; }
public List<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以在Category类上装饰我的Products属性,所以它是这样序列化的?
<Container>
<Category>
<CategoryName>Unicorn Stuff</CategoryName>
<Product>
<Id>1212</Id>
<Name>Unicorn Dust</Name>
</Product>
<Product>
<Id>1829</Id>
<Name>Horn Extension</Name>
</Product>
<Product>
<Id>27373</Id>
<Name>Facemask with hole</Name>
</Product>
</Category>
<Category>
<CategoryName>Pixie</CategoryName>
<Product>
<Id>222</Id>
<Name>Pixie Dust</Name>
</Product>
</Category>
</Container>
Run Code Online (Sandbox Code Playgroud)
请注意,每个类别都有类别元素(类别名称)和0-n Product子元素.
...或者我是否需要以更加手动的方式生成文档?
(这不是我设计xml结构的方式,但是嘿 - 我们生活在一个不完美的世界)
我正在尝试使用XMLSerializer将文本写入XML文件.text(String)-function自动转义字符.
将其添加到xml-File时是否可以不转义文本?
如果不可能,您是否可以推荐一个简单的解决方法,而无需重写我的所有XML创建代码?
谢谢
我想将以下xml反序列化到我的类中,我无法更改xml,因为它通过tcp/ip来自设备.
<?xml version="1.0" encoding="utf-8"?>
<CONTACTINFORMATION UID="1234">
<LoginId><![CDATA[1234]]></LoginId>
<ContactId><![CDATA[2134]]></ContactId>
<ContactType>CCININTERN</ContactType>
<Status>CONVERSATION</Status>
<From><![CDATA[123]]></From>
<To><![CDATA[123]]></To>
<WaitTime><![CDATA[123]]></WaitTime>
<ContactPropertySummary>
<ContactProperty>
<Name><![CDATA[13]]></Name>
<Value><![CDATA[13]]></Value>
<Hidden>NO</Hidden>
<Url><![CDATA[13]]></Url>
</ContactProperty>
</ContactPropertySummary>
<SkillSummary>
<Skill>
<Name><![CDATA[123]]></Name>
<Mandatory>YES</Mandatory>
</Skill>
<Skill>
<Name><![CDATA[124]]></Name>
<Mandatory>YES</Mandatory>
</Skill>
</SkillSummary>
<ContactCodeSummary>
<ContactCode>
<Id>123</Id>
<Hidden>NO</Hidden>
<Assigned>YES</Assigned>
</ContactCode>
</ContactCodeSummary>
<GroupSummary>
<Group>
<Name><![CDATA[123]]></Name>
<Mandatory>YES</Mandatory>
</Group>
</GroupSummary>
<PreviousAgent><![CDATA[2]]></PreviousAgent>
<ScratchPadId><![CDATA[2]]></ScratchPadId>
<ScratchPadData><![CDATA[2]]></ScratchPadData>
<FaxSpecific>
<NbrOfPages>2</NbrOfPages>
</FaxSpecific>
</CONTACTINFORMATION>
Run Code Online (Sandbox Code Playgroud)
我的课:
[Serializable]
[XmlRoot("CONTACTINFORMATION")]
public class Contact
{
#region :: PROPERTIES ::
public string LoginId { get; set; }
public string ContactId { get; set; }
public ContactType ContactType { …Run Code Online (Sandbox Code Playgroud) 我试图使用XmlAttributeOverrides来控制哪些类属性在序列化后显示在xml中。它适用于“根”类上的属性,但不适用于嵌套属性。这是一个简单的示例,以说明我要完成的工作。
我的班级层次结构如下:
public class Main
{
public string Name { get; set; }
public Location Address { get; set; }
}
public class Location
{
public string StreetAddress { get; set; }
public Contact ContactInfo{ get; set; }
}
public class Contact
{
public string PhoneNumber { get; set; }
public string EmailAddr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我序列化Main()时,我得到如下信息:
<Main>
<Name></Name>
<Address>
<StreetAddress></StreetAddress>
<ContactInfo>
<PhoneNumber></PhoneNumber>
<EmailAddr></EmailAddr>
</ContactInfo>
</Address>
</Main>
Run Code Online (Sandbox Code Playgroud)
我所能做的就是通过使用以下命令来避免显示名称或地址:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可以通过XMLSerializer序列化为XML的类.
目标XML应该看起来像这样
<subject_datas type="array">
<subject_data>
...
</subject_data>
<subject_data>
...
</subject_data>
</subject_datas>
Run Code Online (Sandbox Code Playgroud)
问题是subject_datas标记的type属性.我尝试的是将其设计为派生List并附加具有XMLAttribute属性的属性
[XmlRoot(ElementName = "subject_datas")]
public class SubjectDatas : List<SubjectData>
{
public SubjectDatas (IEnumerable<SubjectData> source)
{
this.AddRange(source);
Type = "array";
}
[XmlAttribute(AttributeName = "type")]
public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是因为类是Collection,所以XMLSerializer将序列化Collection中的对象而不是Collection本身.所以我的Type属性被忽略了:(
我有一棵树,想要将它们序列化为xml.节点派生自Nodebase类(我认为在这里找到),它在序列化时失败.
public class NodeBase : IEqualityComparer, IEnumerable, IEnumerable<NodeBase>
{
public NodeBase Parent { get; private set; }
private readonly IList<NodeBase> children = new ObservableCollection<NodeBase>();
public NodeBase this[int index]
{
get
{
return this.children[index];
}
}
public void AddChild(NodeBase childNode, int index = -1)
{
if (index < -1)
{
throw new ArgumentException("The index can not be lower then -1");
}
if (index > this.Children.Count() - 1)
{
throw new ArgumentException("The index ({0}) can not be higher then index of the …Run Code Online (Sandbox Code Playgroud) 我有一个包含一些特殊字符“&是引起问题的特殊字符”的xml工作表,我使用下面的代码反序列化XML
XMLDATAMODEL imported_data;
// Create an instance of the XmlSerializer specifying type and namespace.
XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMODEL));
// A FileStream is needed to read the XML document.
FileStream fs = new FileStream(path, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
// Use the Deserialize method to restore the object's state.
imported_data = (XMLDATAMODEL)serializer.Deserialize(reader);
fs.Close();
Run Code Online (Sandbox Code Playgroud)
我的XML MOdel的structre是这样的
[XmlRoot(ElementName = "XMLDATAMODEL")]
public class XMLDATAMODEL
{
[XmlElement(ElementName = "EventName")]
public string EventName { get; set; }
[XmlElement(ElementName = "Location")]
public …Run Code Online (Sandbox Code Playgroud)