Я забыл писать 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
, теперь выдал бы исключение...
Измените свой код следующим образом:
public void ReadXml(System.Xml.XmlReader reader)
{
reader.Read();
this.C = reader.ReadElementString();
this.D = reader.ReadElementString();
reader.Read();
}
Сначала вы пропускаете начало узла Item, читаете две строки, затем читаете мимо конечного узла, чтобы читатель оказался в правильном месте. Это прочитает все узлы в массиве.
Вы должны быть внимательны при изменении xml самостоятельно :)
Вам не нужно использовать 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>