2017-02-13 210 views
1

我試圖反序列化下面的XML包裹它的價值:C#反序列化XML屬性而不

<venue href="http://SomeUrl"> 
    <location id="ABC"/> 
    <title>Some title</title> 
</venue> 

當我與類包裝它像下面XmlSerializer作品般的魅力

[XmlRoot(ElementName = "venue")] 
public class VenueModel 
{ 
    [XmlElement("location")] 
    public Location Location; 

    [XmlElement("title")] 
    public string Title; 

    [XmlAttribute("href")] 
    public string Href; 
} 

public class Location 
{ 
    [XmlAttribute("id")] 
    public string Id; 
} 

但在我看來,將簡單的字符串從Location包裝到單獨的類中是非常枯燥的解決方案。我想要實現的是創建一個更簡單的展平模型,如下所示:

[XmlRoot(ElementName = "venue")] 
public class VenueModel2 
{ 
    [SomeMagicAttribute] 
    public string LocationId; 

    [XmlElement("title")] 
    public string Title; 

    [XmlAttribute("href")] 
    public string Href; 
} 

第一個問題?是否有可能使用C#System.Xml.Serialization?如果是這樣,獲取這些數據的神奇屬性是什麼?

+0

在類位置你缺少文本:[XmlText] public string Text {get;組; }否則,您無法讀取中的值。 –

+0

位置沒有任何文本值。它只包含ID發送爲屬性。這是它唯一設計的 – Misiakw

+0

在這種情況下,它不應該是一個屬性,而應該是locationid的值。但我想你不能改變這個? –

回答

0

我發現的是,首先,我需要應用XSL轉換(如下面的一個)輸入XML

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" indent="no"/> 
     <xsl:template match="/"> 
      <venue> 
      <href><xsl:value-of select="/venue/@href" /></href> 
      <locationId><xsl:value-of select="/venue/location/@id" /></locationId> 
      <title><xsl:value-of select="/venue/title" /></title> 
      </venue> 
    </xsl:template> 
</xsl:stylesheet> 

,然後輸出XML看起來是這樣的:

<venue> 
    <href>SomeUrl</href> 
    <locationId>ABC</locationId> 
    <title>Some title</title> 
</venue> 

其所能比被反序列化爲我想要的形式。並applyink這個翻譯在C#代碼是這裏描述:C# How to perform a live xslt transformation on an in memory object?