Usar XmlAttributeOverrides para cambiar los nombres de elementos en el árbol de objetos

Necesito descubrir cómo cambiar el nombre de los elementos y/o atributos en el xml generado usando los valores recuperados de la base de datos como mis nombres de elementos.

Por ejemplo, aquí hay un posible resultado xml de mi proceso actual:


  
    
      
        
          
            Medication Name
            Celebrex
          
          
            Medication Dosage
            20000MG
          
          
            Medication Prescribed Date
            08/01/2013
          
        
      
      
        
          
            Medication Name
            Aspirin
          
          
            Medication Dosage
            5 mg
          
          
            Medication Prescribed Date
            09/01/2013
          
        
      
      
        
          
            Medication Name
            Celebrex
          
          
            Medication Dosage
            50 mg twice a day
          
          
            Medication Prescribed Date
            10/01/2013
          
        
      
    
    
      
        User First Name
        John
      
      
        User MI
        Q
      
      
        User Last Name
        Public
      
      
        User SSN
        111-22-3333
      
    
  

Lo que necesito lograr es esto:


  
    
      
        
          
            Medication Name
            Celebrex
          
          
            Medication Dosage
            20000MG
          
          
            Medication Prescribed Date
            08/01/2013
          
        
      
      
        
          
            Medication Name
            Aspirin
          
          
            Medication Dosage
            5 mg
          
          
            Medication Prescribed Date
            09/01/2013
          
        
      
      
        
          
            Medication Name
            Celebrex
          
          
            Medication Dosage
            50 mg twice a day
          
          
            Medication Prescribed Date
            10/01/2013
          
        
      
    
    
      
        User First Name
        John
      
      
        User MI
        Q
      
      
        User Last Name
        Public
      
      
        User SSN
        111-22-3333
      
    
  

Aquí están mis objetos:

public class EntityProperty
{
    [XmlIgnore]
    public int FieldId { get; set; }
    public string FieldName { get; set; }
    [XmlIgnore]
    public int FieldSortOrder { get; set; }
    [XmlAttribute()]
    public DateTime CreatedDate { get; set; }
    [XmlIgnore]
    public bool IsIterative { get; set; }
    public string Value { get; set; }
    public EntityTreeBase Entity { get; set; }
    public EntityProperty() { }
    public EntityProperty(int fieldId, string fieldName, int fieldSortOrder, DateTime createdDate, bool isIterative, string valueIn)
    {
        FieldId = fieldId;
        FieldName = FieldName;
        FieldSortOrder = fieldSortOrder;
        CreatedDate = createdDate;
        IsIterative = isIterative;
        Value = valueIn;
    }
}

public class EntityTreeBase
{
    [XmlIgnore]
    public long EntityId { get; set; }
    [XmlIgnore]
    public long? ParentEntityId { get; set; }
    [XmlIgnore]
    public int EntityDefinitionId { get; set; }
    [XmlIgnore]
    public int DestinationId { get; set; }
    [XmlIgnore]
    public int Level { get; set; }
    [XmlAttribute("EntityInfo")]
    public string EntityDefinitionName { get; set; }
    public EntityTreeBaseCollection Children { get; set; }
    public EntityPropertiesCollection Properties { get; set; }
    public EntityTreeBase() { }
    public EntityTreeBase(long entityId, long? parentEntityId, int entityDefinitionId, int destinationId, int level, string entityDefinitionName)
    {
        EntityId = entityId;
        ParentEntityId = parentEntityId;
        EntityDefinitionId = entityDefinitionId;
        DestinationId = destinationId;
        Level = level;
        EntityDefinitionName = entityDefinitionName;
    }
    public bool HasChildren
    {
        get { return (Children != null && Children.Count > 0); }
    }
    public bool HasProperties
    {
        get { return (Properties != null && Properties.Count > 0); }
    }
    public static EntityTreeBase BuildTree(EntityTreeBaseCollection collection, EntityTreeBase parent)
    {
        parent.Properties = EntityPropertiesCollection.GetProperties(parent.DestinationId, parent.EntityId, parent.EntityDefinitionId);
        parent.Children = new EntityTreeBaseCollection();
        foreach (EntityTreeBase item in EntityTreeBaseCollection.FindChildEntities(collection, parent.EntityId))
        {
            parent.Children.Add(BuildTree(EntityTreeBaseCollection.GetChildren(item.EntityId, item.Level, item.DestinationId), item));
        }
        if (!parent.HasChildren)
        {
            parent.Children = null;
        }
        if (!parent.HasProperties)
        {
            parent.Properties = null;
        }
        return parent;
    }
}

Entonces, como es de esperar obvio, no hay tipos de objetos llamados "Medicación" o "Usuario", estos deben inferirse a partir de los datos. Así que necesito saber cómo usar los valores de los datos para cambiar los nombres de mis elementos, pero necesito descubrir cómo rastrear el árbol de objetos para que cada nombre de elemento se modifique en función del EntityDefinitionName asociado. Estoy usando recursividad para poblar mi árbol de objetos antes de la serialización. Sé que el siguiente código funciona para cambiar el nombre de mi XmlRoot:

XmlAttributeOverrides xmlOverrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
XmlRootAttribute rootAttr = new XmlRootAttribute();
rootAttr.ElementName = collection.Find(e => e.Level == 1).EntityDefinitionName.Replace(" ", "");
attribs.XmlRoot = rootAttr;

Pero necesito descubrir cómo cambiar el nombre de cada elemento en función del EntityDefinitionName asociado con ese elemento o nodo.

¡Gracias por adelantado!

0

1 Respuestas

Aunque creo que puede lograr eso mediante el uso de serialización personalizada, quiero presentar un enfoque diferente para resolver su pregunta mediante el uso de una hoja de estilo XSLT.

Esta hoja de estilo transforma tu entrada xml en tu salida deseada xml:


    

    
       
        
       
    

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

  
    
      
      
    
  

  
    
      
       
    
  


Este es el código que puede usar para ejecutar la transformación en su código c #:

 var xml = File.Open("input.xml", FileMode.Open);//or any stream
 var xslTrans = new XslCompiledTransform();
 xslTrans.Load(XmlReader.Create(File.Open("yourxslfile.xlst", FileMode.Open)));
 var output = File.Create("output.xml"); //or a stream
 var xw = XmlWriter.Create(output);
 xslTrans.Transform(XmlReader.Create(xml), xw );
 xw.Close();
0
agregado