5

Zakładając XML tak:Cofnięcie wartość elementu jako ciąg mimo że zawiera mieszaną zawartość

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex> 
     <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
      <div><h1>content</h1></div> 
     </html> 
    </my:FieldComplex> 
<my:Root> 

i klasę jak:

[Serializable] 
[XmlType(AnonymousType = true, Namespace = "http://foo/bar")] 
[XmlRoot(ElementName = "Root", Namespace = "http://foo/bar", IsNullable = false)] 
public class MyRoot 
{ 
    public string FieldBasic { get; set; } 
    public string FieldComplex { get; set; } 
} 

Jak deserializowania <my:FieldComplex> na sznurku w FieldComplex? Nie powiedzie się, gdy znajdzie kod HTML w środku. Chcę, aby dać mi łańcuch z tej treści:

<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
    <div><h1>content</h1></div> 
</html> 

Jeśli oświadczam FieldComplex jak public object FieldComplex (tj xsd:anyType) to trochę działa, a ja dostaję XMLNode[] wewnątrz którego można używać.

Ale muszę FieldComplex być typu ciąg dla serializacji jak dla serializacji XML nie może zawierać kodu HTML, to będzie tak:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex>content</my:FieldComplex> 
<my:Root> 

Deklarowanie FieldComplex jak obiekt będzie wstawić te atrybuty na <my:FieldComplex> element:

xmlns:q1="http://www.w3.org/2001/XMLSchema" p3:type="q1:string" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance 

i nie chcę tego. Nie chcę również używać różnych klas do serializacji i deserializacji.

Czy to możliwe?

Aby długie opowiadanie, to jest możliwe, aby mieć tę klasę:

public class MyRoot 
{ 
    public string FieldBasic { get; set; } 
    public string FielComplex { get; set; } 
} 

serializacji do tego:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex>content</my:FieldComplex> 
<my:Root> 

i deserializowania z tego:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex> 
     <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
      <div><h1>content</h1></div> 
     </html> 
    </my:FieldComplex> 
<my:Root> 

?

P.S. Po prostu wyjaśnić "dlaczego?". Mam czarownicę klasową, która jest serializowana. Serializowany XML przechodzi następnie przez wiele węzłów w aplikacji i ostatecznie wraca, ale zmienia się jak wyżej. Warstwy wykonują pewne sprawdzanie poprawności XML, a dodatkowe atrybuty lub elementy na wejściu nie sprawdzają poprawności i zatrzymują przepływ. Chcę odwzorować zwracany kod XML na tę samą klasę. Zawartość jest tylko struny od jego punktu widzenia, ale oczywiście nie to samo dla serializacji/deserializacji :(

Odpowiedz

3

To nie jest całkiem skończone, ponieważ nie pamiętam, czy można/jak dodać prefiks przestrzeni nazw do elementu głównego w Serializacji Xml.Ale jeśli wdrożyć IXmlSerializable interfejs w swojej klasie MyRoot jak ten:

[XmlRoot("Root", Namespace="http://foo/bar")] 
public class MyRoot : IXmlSerializable 

Następnie należy napisać metod siebie serializacji XML, coś takiego:

 void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) 
     { 
      reader.MoveToContent(); 
      var outerXml = reader.ReadOuterXml(); 
      XElement root = XElement.Parse(outerXml); 

      this.FieldBasic = root.Elements(XName.Get("FieldBasic", "http://foo/bar")).First().Value; 
      this.FieldComplex = root.Elements(XName.Get("FieldComplex", "http://foo/bar")).First().Elements().First().Value.Trim(); 
     } 



     void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) 
     { 
      writer.WriteRaw(String.Format("\r\n\t<my:FieldBasic>\r\n\t\t{0}\r\n\t</my:FieldBasic>", this.FieldBasic)); 
      writer.WriteRaw(String.Format("\r\n\t<my:FieldComplex>\r\n\t\t{0}\r\n\t</my:FieldComplex>\r\n", this.FieldComplex)); 
     } 

(zwróci NULL z metody GetSchema)

To powinno ci przynajmniej sprawić, żebyś był blisko.

Możesz również znaleźć te linki pomocne.

IXmlSerializable

Namespaces

+0

Dziękuję bardzo za to rozwiązanie :). Właśnie tego szukałem. – Beniamin

3

można użyć CDATA w formacie XML, aby wskazać, że treść jest ciągiem dosłowny:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex> 
    <![CDATA[ 
     <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
     <div><h1>content</h1></div> 
     </html> 
    ]]> 
    </my:FieldComplex> 
</my:Root> 
+1

Niestety mam kontrolę tylko na to, co dostaje się do strumienia, co nie wychodzi. Nie mogę dodać . – JohnDoDo

Powiązane problemy