2013-12-16 44 views
1

我需要弄清楚如何重命名元素和/或使用數據庫作爲我的元素名稱檢索值生成的XML屬性的元素名稱。使用XmlAttributeOverrides更改對象樹

舉例來說,這裏是從我目前的進程XML輸出電位:

<ArrayOfEntityTreeBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <EntityTreeBase EntityInfo="User"> 
    <Children> 
     <EntityTreeBase EntityInfo="User Medication"> 
     <Properties> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.75"> 
      <FieldName>Medication Name</FieldName> 
      <Value>Celebrex</Value> 
      </EntityProperty> 
      <EntityProperty CreatedDate="2013-12-04T14:08:58.597"> 
      <FieldName>Medication Dosage</FieldName> 
      <Value>20000MG</Value> 
      </EntityProperty> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.76"> 
      <FieldName>Medication Prescribed Date</FieldName> 
      <Value>08/01/2013</Value> 
      </EntityProperty> 
     </Properties> 
     </EntityTreeBase> 
     <EntityTreeBase EntityInfo="User Medication"> 
     <Properties> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.767"> 
      <FieldName>Medication Name</FieldName> 
      <Value>Aspirin</Value> 
      </EntityProperty> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.77"> 
      <FieldName>Medication Dosage</FieldName> 
      <Value>5 mg</Value> 
      </EntityProperty> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.78"> 
      <FieldName>Medication Prescribed Date</FieldName> 
      <Value>09/01/2013</Value> 
      </EntityProperty> 
     </Properties> 
     </EntityTreeBase> 
     <EntityTreeBase EntityInfo="User Medication"> 
     <Properties> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.783"> 
      <FieldName>Medication Name</FieldName> 
      <Value>Celebrex</Value> 
      </EntityProperty> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.793"> 
      <FieldName>Medication Dosage</FieldName> 
      <Value>50 mg twice a day</Value> 
      </EntityProperty> 
      <EntityProperty CreatedDate="2013-11-14T16:41:12.8"> 
      <FieldName>Medication Prescribed Date</FieldName> 
      <Value>10/01/2013</Value> 
      </EntityProperty> 
     </Properties> 
     </EntityTreeBase> 
    </Children> 
    <Properties> 
     <EntityProperty CreatedDate="2013-12-03T13:48:03.45"> 
     <FieldName>User First Name</FieldName> 
     <Value>John</Value> 
     </EntityProperty> 
     <EntityProperty CreatedDate="2013-12-03T11:36:31.423"> 
     <FieldName>User MI</FieldName> 
     <Value>Q</Value> 
     </EntityProperty> 
     <EntityProperty CreatedDate="2013-11-19T09:56:44.66"> 
     <FieldName>User Last Name</FieldName> 
     <Value>Public</Value> 
     </EntityProperty> 
     <EntityProperty CreatedDate="2013-11-14T16:41:12.803"> 
     <FieldName>User SSN</FieldName> 
     <Value>111-22-3333</Value> 
     </EntityProperty> 
    </Properties> 
    </EntityTreeBase> 
</ArrayOfEntityTreeBase> 

我需要做到的是:

<UserInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <User> 
    <UserMedications> 
     <UserMedication> 
     <MedicationProperties> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.75"> 
      <FieldName>Medication Name</FieldName> 
      <Value>Celebrex</Value> 
      </MedicationProperty> 
      <MedicationProperty CreatedDate="2013-12-04T14:08:58.597"> 
      <FieldName>Medication Dosage</FieldName> 
      <Value>20000MG</Value> 
      </MedicationProperty> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.76"> 
      <FieldName>Medication Prescribed Date</FieldName> 
      <Value>08/01/2013</Value> 
      </MedicationProperty> 
     </MedicationProperties> 
     </UserMedication> 
     <UserMedication> 
     <MedicationProperties> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.767"> 
      <FieldName>Medication Name</FieldName> 
      <Value>Aspirin</Value> 
      </MedicationProperty> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.77"> 
      <FieldName>Medication Dosage</FieldName> 
      <Value>5 mg</Value> 
      </MedicationProperty> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.78"> 
      <FieldName>Medication Prescribed Date</FieldName> 
      <Value>09/01/2013</Value> 
      </MedicationProperty> 
     </MedicationProperties> 
     </UserMedication> 
     <UserMedication> 
     <MedicationProperties> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.783"> 
      <FieldName>Medication Name</FieldName> 
      <Value>Celebrex</Value> 
      </MedicationProperty> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.793"> 
      <FieldName>Medication Dosage</FieldName> 
      <Value>50 mg twice a day</Value> 
      </MedicationProperty> 
      <MedicationProperty CreatedDate="2013-11-14T16:41:12.8"> 
      <FieldName>Medication Prescribed Date</FieldName> 
      <Value>10/01/2013</Value> 
      </MedicationProperty> 
     </MedicationProperties> 
     </UserMedication> 
    </UserMedications> 
    <UserProperties> 
     <UserProperty CreatedDate="2013-12-03T13:48:03.45"> 
     <FieldName>User First Name</FieldName> 
     <Value>John</Value> 
     </UserProperty> 
     <UserProperty CreatedDate="2013-12-03T11:36:31.423"> 
     <FieldName>User MI</FieldName> 
     <Value>Q</Value> 
     </UserProperty> 
     <UserProperty CreatedDate="2013-11-19T09:56:44.66"> 
     <FieldName>User Last Name</FieldName> 
     <Value>Public</Value> 
     </UserProperty> 
     <UserProperty CreatedDate="2013-11-14T16:41:12.803"> 
     <FieldName>User SSN</FieldName> 
     <Value>111-22-3333</Value> 
     </UserProperty> 
    </UserProperties> 
    </User> 
</UserInformation> 

這裏是我的對象:

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

所以,希望是顯而易見的,有一個名爲「藥物」或「用戶」無對象類型,這些必須推斷˚F rom數據。所以,我需要知道如何使用值從數據改變我的元素名稱,但我需要弄清楚如何使每個元素名稱是基於相關EntityDefinitionName改爲抓取對象樹。我使用遞歸來填充我的對象樹之前,系列化。我知道下面的代碼工作重命名我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; 

但我需要弄清楚如何基於與元素或節點相關的EntityDefinitionName更改各元素名稱。

在此先感謝!

回答

0

雖然我認爲可以實現通過使用自定義序列化我想提出一個不同的方法來通過使用XSLT樣式表解決你的問題。

這個樣式表將您的XML輸入您想要的輸出XML:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="ArrayOfEntityTreeBase"> 
     <UserInformation > 
     <xsl:apply-templates /> 
     </UserInformation> 
    </xsl:template> 

    <xsl:template match="EntityTreeBase[@EntityInfo='User']"> 
    <User> 
     <xsl:apply-templates /> 
    </User> 
    </xsl:template> 

    <xsl:template match="Children"> 
    <UserMedications> 
     <xsl:apply-templates /> 
    </UserMedications> 
    </xsl:template> 

    <xsl:template match="EntityTreeBase[@EntityInfo='User Medication']"> 
    <UserMedication> 
     <xsl:apply-templates /> 
    </UserMedication> 
    </xsl:template> 

    <xsl:template match="EntityTreeBase[@EntityInfo='User Medication']/Properties"> 
    <MedicationProperties> 
     <xsl:apply-templates /> 
    </MedicationProperties> 
    </xsl:template> 

    <xsl:template match="EntityTreeBase[@EntityInfo='User']/Properties"> 
    <UserProperties> 
     <xsl:apply-templates/> 
    </UserProperties> 
    </xsl:template> 

    <xsl:template match="EntityTreeBase[@EntityInfo='User']/Properties/EntityProperty"> 
    <xsl:element name="UserProperty"> 
     <xsl:copy-of select="@*"/> 
     <xsl:copy-of select="*" /> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="EntityTreeBase[@EntityInfo='User Medication']/Properties/EntityProperty"> 
    <xsl:element name="MedicationProperty"> 
     <xsl:copy-of select="@*"/> 
     <xsl:copy-of select="*" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

這是你可以使用運行轉換在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();