2017-02-13 7 views
1

Я пытаюсь десериализации XML ниже:C# Deserialize 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

Местоположение не имело никакого текстового значения. он содержит только идентификатор отправки как атрибут. и это единственное, что оно предназначено для – 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?