Реализация IXmlSerializable на объекте коллекции

Я забыл писать echo в PHP слишком много раз:

<td><?php $foo->bar->baz(); ?></td>
<!-- should have been -->
<td><?php echo $foo->bar->baz(); ?></td>

Это взяло бы меня навсегда, чтобы попытаться выяснить, почему-> baz () ничего не возвращал, когда на самом деле я просто не повторял его!:-S Таким образом, я сделал EchoMe класс, который мог быть перенесен вокруг любого значения, которое должно быть отражено:

<?php
class EchoMe {
  private $str;
  private $printed = false;
  function __construct($value) {
    $this->str = strval($value);
  }
  function __toString() {
    $this->printed = true;
    return $this->str;
  }
  function __destruct() {
    if($this->printed !== true)
      throw new Exception("String '$this->str' was never printed");
  }
}

И затем для среды разработки, я использовал EchoMe для обертывания вещей, которые должны быть распечатаны:

function baz() {
  $value = [...calculations...]
  if(DEBUG)
    return EchoMe($value);
  return $value;
}

Используя ту технику, первый пример, отсутствующий эти echo, теперь выдал бы исключение...

5
задан Jesper Palm 6 September 2009 в 12:27
поделиться

2 ответа

Измените свой код следующим образом:

    public void ReadXml(System.Xml.XmlReader reader)
    {
        reader.Read();
        this.C = reader.ReadElementString();
        this.D = reader.ReadElementString();
        reader.Read();
    }

Сначала вы пропускаете начало узла Item, читаете две строки, затем читаете мимо конечного узла, чтобы читатель оказался в правильном месте. Это прочитает все узлы в массиве.

Вы должны быть внимательны при изменении xml самостоятельно :)

2
ответ дан 15 December 2019 в 06:31
поделиться

Вам не нужно использовать IXmlSerializable. Но при желании следует реализовать метод GetShema (). После некоторой модификации код, который работает, выглядит следующим образом:

    [XmlRoot("XmlObject")]
public class XmlObject
{
    [XmlElement("A")]
    public string A { get; set; }
    [XmlElement("B")]
    public string B { get; set; }
    [XmlElement("listitems")]
    public List<Item> listitems { get; set; }
}

public class Item : IXmlSerializable
{
    [XmlElement("C")]
    public string C { get; set; }
    [XmlElement("D")]
    public string D { get; set; }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        this.C = reader.ReadElementString();
        this.D = reader.ReadElementString();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("C", this.C);
        writer.WriteElementString("D", this.D);
    }

    #endregion
}

Результаты для 2 элементов в списке элементов будут выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<XmlObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <A>value</A>
  <B>value</B>
  <listitems>
    <C>value0</C>
    <D>value0</D>
  </listitems>
  <listitems>
    <C>value1</C>
    <D>value1</D>
  </listitems>
</XmlObject>
1
ответ дан 15 December 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: