Verwenden Sie XmlAttributeOverrides, um Elementnamen in der Objektbaumstruktur zu ändern

Ich muss herausfinden, wie Elemente und/oder Attribute in generiertem xml umbenannt werden, indem Werte aus der Datenbank als meine Elementnamen verwendet werden.

Zum Beispiel ist hier eine mögliche XML-Ausgabe von meinem aktuellen Prozess:


  
    
      
        
          
            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
      
    
  

Was ich erreichen muss, ist folgendes:


  
    
      
        
          
            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
      
    
  

Hier sind meine Objekte:

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;
    }
}

Es gibt also, wie hoffentlich offensichtlich ist, keine Objekttypen mit dem Namen "Medikation" oder "Benutzer", diese müssen aus den Daten abgeleitet werden. Also muss ich wissen, wie man Werte aus den Daten benutzt, um meine Elementnamen zu ändern, aber ich muss herausfinden, wie der Objektbaum gecrawlt werden kann, so dass jeder Elementname basierend auf dem zugehörigen EntityDefinitionName geändert wird. Ich verwende Rekursion, um den Objektbaum vor der Serialisierung zu füllen. Ich weiß, dass der folgende Code funktioniert, um mein XmlRoot umzubenennen:

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;

Aber ich muss herausfinden, wie man jeden Elementnamen basierend auf dem EntityDefinitionName ändert, der diesem Element oder Knoten zugeordnet ist.

Danke im Voraus!

0

1 Antworten

Obwohl ich denke, dass Sie dies erreichen können, indem Sie die benutzerdefinierte Serialisierung verwenden, möchte ich einen anderen Ansatz zur Lösung Ihrer Frage darstellen, indem Sie ein XSLT-Stylesheet verwenden.

Dieses Stylesheet wandelt Ihr Eingabe-XML in das gewünschte Ausgabe-XML um:


    

    
       
        
       
    

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

  
    
      
    
  

  
    
      
      
    
  

  
    
      
       
    
  


Dies ist der Code, mit dem Sie die Umwandlung in Ihrem C# -Code ausführen können:

 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
hinzugefügt