xml序列化 - 动态更改元素名称 [英] xml serialization - dynamically change element name

查看:67
本文介绍了xml序列化 - 动态更改元素名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用xmlserialization,创建了一些类,但对于一个节点我想要xml为

 <   AliasNames  >  
< AliasGivenName1 > Joe < / AliasGivenName1 >
< AliasMiddleName1 > < / AliasMiddleName1 >
< AliasFamilyName1 > Doe < / Alias FamilyName1 >
< AliasGivenName2 > Jerry < / AliasGivenName2 >
< AliasMiddleName2 > B < / AliasMiddleName2 >
< AliasFamilyName2 > Doe < / AliasFamilyName2 >
< AliasGivenName3 > Jim < / AliasGivenName3 >
< AliasMiddleName3 > C < / AliasMiddleName3 >
< AliasFamilyName3 > Doe < / AliasFamilyName3 >


< / AliasNames >



这包含添加到xml节点的索引。



如何实现这一目标,请帮忙。



提前致谢。

解决方案

您应该重新考虑序列化数据的方式,以获得更像xml的内容:

 <   aliasnames  >  
< aliasname >
< 给定 > Joe < / given >
< middle > < / middle >
< family > Doe < / family >
< / aliasname >
< aliasname >
< 给定 > Jerry < < span class =code-leadattribute> / given >
< middle > B < < span class =code-leadattribute> / middle >
< family > Doe < / family >
< / aliasname >
< aliasname >
< 给定 > Jim < span class =code-keyword>< / given >
< middle > C < span class =code-keyword>< / middle >
< 系列 > Doe < / family >
< / aliasname >
< / aliasnames < span class =code-keyword>>



这可以使用具有Given,Middle和Family属性的AliasName类数组来完成。 />


如果你不能改变xml格式,你应该自己使用XmlDocument:

 XmlDocument xml = < span class =code-keyword> new  XmlDocument(); 
XmlElement eltRoot = xml.CreateElement( AliasNames);
xml.AppendChild(eltRoot);
for int i = 1 ; i< = arrayOfNames.Length(); ++ i)
{
XmlElement elt = xml.CreateElement( AliasGivenName + I);
elt.InnertText = arrayOfNames [i] .GivenName;
eltRoot.AppendChild(elt);
elt = xml.CreateElement( AliasMiddleName + i);
elt.InnerText = arrayOfNames [i] .MiddleName;
eltRoot.AppendChild(elt);
elt = xml.CreateElement( AliasFamilyName + i);
elt.InnertText = arrayOfNames [i] .FamilyName;
eltRoot.AppendChild(elt);
}
xml.Save(filename);


不要这样做。请改为:

 <   aliasnames  >  
< aliasname >
< aliasgivenname > Joe < / aliasgivenname >
< aliasmiddlename > < / aliasmiddlename >
< aliasfamilyname > Doe < / aliasfamilyname >
< / aliasname >
< aliasname >
< aliasgivenname > Jerry < / aliasgivenname >
< aliasmiddlename > B < / aliasmiddlename >
< aliasfamilyname > Doe < / aliasfamilyname >
< / aliasname >
< aliasname >
< aliasgivenname > Jim < / aliasgivenname >
< aliasmiddlename > C < / aliasmiddlename >
< aliasfamilyname > Doe < / aliasfamilyname >
< / aliasname >
< / aliasnames < span class =code-keyword>>


感谢您的回复。我使用xml序列化程序将您提供的代码与我的代码集成在一起。

  //  函数返回带有值的XmlDocument  
public XmlDocument GetAliasNames()
{
XmlDocument xml = new XmlDocument();
XmlElement eltRoot = xml.CreateElement( AliasNames);
xml.AppendChild(eltRoot);
for int i = 1 ; i< = arrayOfNames.Length(); ++ i)
{
XmlElement elt = xml.CreateElement( AliasGivenName + I);
elt.InnertText = arrayOfNames [i] .GivenName;
eltRoot.AppendChild(elt);
elt = xml.CreateElement( AliasMiddleName + i);
elt.InnerText = arrayOfNames [i] .MiddleName;
eltRoot.AppendChild(elt);
elt = xml.CreateElement( AliasFamilyName + i);
elt.InnertText = arrayOfNames [i] .FamilyName;
eltRoot.AppendChild(elt);
}
return xml;
}





我上课了;

  public   class  _PersonalData 
{
public _PersonName PersonName = new _PersonName();
public _DemographicDetail DemographicDetail = new _DemographicDetail();

public XmlDocument AliasNames { get ; set ; }
}







我将值设置为;



 PersonalData.AliasNames = GetAliasNames(); 





和my xml为;



 <   BackgroundSearchPackage  >  
< PersonalData >
< PersonName >
< GivenName > pritam < / GivenName >
< 中间名 > ravi < / MiddleName >
< FamilyName > Ajmire < / FamilyName >
< / PersonName >
< DemographicDetail >
< Ssn > 234523dsf < / Ssn >
< DateOfBirth > 14/23/1990 < ; / DateOfBirth >
< 种族 > dsf < ; / Race >
< GenderCode > M < ; / GenderCode >
< / DemographicDetail >
< AliasNames >
< AliasNames >
< AliasGivenName1 > GN1 < / AliasGivenName1 >
< AliasMiddleName1 > MN1 < / AliasMiddleName1 >
< AliasFamilyName1 > FN1 < / AliasFamilyName1 >
< / AliasNames >
< / AliasNames >
< / PersonalData >
< / BackgroundSearchPackage >


I am using xmlserialization, created some classes, but for one node I want xml as

<AliasNames>
<AliasGivenName1>Joe</AliasGivenName1>
<AliasMiddleName1>A</AliasMiddleName1>
<AliasFamilyName1>Doe</AliasFamilyName1>
<AliasGivenName2>Jerry</AliasGivenName2>
<AliasMiddleName2>B</AliasMiddleName2>
<AliasFamilyName2>Doe</AliasFamilyName2>
<AliasGivenName3>Jim</AliasGivenName3>
<AliasMiddleName3>C</AliasMiddleName3>
<AliasFamilyName3>Doe</AliasFamilyName3>


</AliasNames>


This contains index added to xml node.

how can I accomplish this, please help.

Thanks in advance.

解决方案

You should reconsider the way you are serialising your data to have something more "xml-like":

<aliasnames>
  <aliasname>
    <given>Joe</given>
    <middle>A</middle>
    <family>Doe</family>
  </aliasname>
  <aliasname>
    <given>Jerry</given>
    <middle>B</middle>
    <family>Doe</family>
  </aliasname>
  <aliasname>
    <given>Jim</given>
    <middle>C</middle>
    <family>Doe</family>
  </aliasname>
</aliasnames>


This can be done using an array of AliasName class with Given, Middle and Family properties.

If you cannot change the xml format, you should use the XmlDocument by yourself:

XmlDocument xml = new XmlDocument();
XmlElement eltRoot = xml.CreateElement("AliasNames");
xml.AppendChild(eltRoot);
for(int i=1; i<=arrayOfNames.Length(); ++i)
{
  XmlElement elt = xml.CreateElement("AliasGivenName"+i);
  elt.InnertText = arrayOfNames[i].GivenName;
  eltRoot.AppendChild(elt);
  elt = xml.CreateElement("AliasMiddleName"+i);
  elt.InnerText = arrayOfNames[i].MiddleName;
  eltRoot.AppendChild(elt);
  elt = xml.CreateElement("AliasFamilyName"+i);
  elt.InnertText = arrayOfNames[i].FamilyName;
  eltRoot.AppendChild(elt);
}
xml.Save(filename);


Don't do it that way. Do this instead:

<aliasnames>
 <aliasname>
   <aliasgivenname>Joe</aliasgivenname>
   <aliasmiddlename>A</aliasmiddlename>
   <aliasfamilyname>Doe</aliasfamilyname>
 </aliasname>
 <aliasname>
   <aliasgivenname>Jerry</aliasgivenname>
   <aliasmiddlename>B</aliasmiddlename>
   <aliasfamilyname>Doe</aliasfamilyname>
 </aliasname>
 <aliasname>
   <aliasgivenname>Jim</aliasgivenname>
   <aliasmiddlename>C</aliasmiddlename>
   <aliasfamilyname>Doe</aliasfamilyname>
 </aliasname>
</aliasnames>


Thanks for your response. I have integrated code supplied by you with my code using xml serializer.

// function returns XmlDocument with values
public XmlDocument GetAliasNames()
{
  XmlDocument xml = new XmlDocument();
  XmlElement eltRoot = xml.CreateElement("AliasNames");
  xml.AppendChild(eltRoot);
  for(int i=1; i<=arrayOfNames.Length(); ++i)
  {
    XmlElement elt = xml.CreateElement("AliasGivenName"+i);
    elt.InnertText = arrayOfNames[i].GivenName;
    eltRoot.AppendChild(elt);
    elt = xml.CreateElement("AliasMiddleName"+i);
    elt.InnerText = arrayOfNames[i].MiddleName;
    eltRoot.AppendChild(elt);
    elt = xml.CreateElement("AliasFamilyName"+i);
    elt.InnertText = arrayOfNames[i].FamilyName;
    eltRoot.AppendChild(elt);
  }
  return xml;
}



I had a class as;

public class _PersonalData
{
    public _PersonName PersonName = new _PersonName();
    public _DemographicDetail DemographicDetail = new _DemographicDetail();

    public XmlDocument AliasNames { get; set; }
}




and I set values as;

PersonalData.AliasNames = GetAliasNames();



and my xml is as;

<BackgroundSearchPackage>
<PersonalData>
<PersonName>
<GivenName>pritam</GivenName>
<MiddleName>ravi</MiddleName>
<FamilyName>Ajmire</FamilyName>
</PersonName>
<DemographicDetail>
<Ssn>234523dsf</Ssn>
<DateOfBirth>14/23/1990</DateOfBirth>
<Race>dsf</Race>
<GenderCode>M</GenderCode>
</DemographicDetail>
<AliasNames>
<AliasNames>
<AliasGivenName1>GN1</AliasGivenName1>
<AliasMiddleName1>MN1</AliasMiddleName1>
<AliasFamilyName1>FN1</AliasFamilyName1>
</AliasNames>
</AliasNames>
</PersonalData>
</BackgroundSearchPackage>


这篇关于xml序列化 - 动态更改元素名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆