【问题标题】:Add Xml Attribute to string property将 Xml 属性添加到字符串属性
【发布时间】:2010-11-11 12:59:47
【问题描述】:

我有一个自定义对象,它有一个名为“Name”的字符串属性。我想保持由序列化生成的 XML 相同,但向名为“NiceName”的元素添加一个属性,其值为“Full name”。

这是我目前拥有的:

<TheObject>
  <Name>mr nobody</Name>
</TheObject>

这是我想要生成的:

<TheObject>
  <Name NiceName='Full name'>mr nobody</Name>
</TheObject>

我只对一些 XSLT 需要这个,所以如果可能的话,我不想改变类的工作方式。 IE。将名称从字符串更改为自定义类。所有对象都将具有相同的属性,它永远不会改变,它将是完全只读的。

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    您可以结合使用 XMLAttribute 和 XmlText()

    以下面的类声明为例:

        public class Description {
        private int attribute_id;
        private string element_text;
    
        [XmlAttribute("id")]
        public int Id {
            get { return attribute_id; }
            set { attribute_id = value; }
        }
    
        [XmlText()]
        public string Text {
            get { return element_text; }
            set { element_text = value; }
        }
    }
    

    输出将是

    <XmlDocRoot>
    <Description id="1">text</Description>
    

    【讨论】:

      【解决方案2】:

      如果你定义另一种类型如下:

      public class Person
      {
      
          private string _name;
      
      
          [XmlIgnore]
          public string Name
          {
              get
              {
                  return _name;
              }
              set
              {
                  _name = value;
                  ThePersonName = new PersonName()
                                      {
                                          Name = FullName,
                                          NiceName = _name
                                      };
              }
          }
      
          [XmlElement(ElementName = "Name")]
          public PersonName ThePersonName { get; set; }
      
          public string FullName { get; set; }
      
      }
      
      public class PersonName
      {
          [XmlAttribute]
          public string NiceName { get; set; }
      
          [XmlText]
          public string Name { get; set; }
      }
      

      使用

              XmlSerializer s = new XmlSerializer(typeof(Person));
              Person ali = new Person();
              ali.FullName = "Ali Kheyrollahi";
              ali.Name = "Nobody";
              s.Serialize(new FileStream("ali.xml",FileMode.Create), ali);
      

      会生成

      <?xml version="1.0"?>
      <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Name NiceName="Nobody">Ali Kheyrollahi</Name>
        <FullName>Ali Kheyrollahi</FullName>
      </Person>
      

      【讨论】:

      • 感谢您的回答,但是我正在尝试为节点名称而不是人名编写替代代码。我知道将其写入 xslt 可能更好,只是我想从 .net 而不是 xslt 管理它。我的意思是我需要在我的 Xslt 中生成类似 Mr Joe Blogs 的内容,然后我只需输出每个元素的 nicename 和值以生成更好的用户界面。像“Full Name=Mr Joe Blogs”而不是“FullName=Joe Blogs”或替代方法是 1234
      • 我不知道如何将同级级别属性作为属性应用到另一个属性。我认为 Aliostad 的回答“似乎”有点混乱,但我认为这是要走的路。
      • 你最好在 xslt 中执行此操作,srsly。 XmlSerializer 无法处理这种扭曲。
      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多