XML, что это: null или пустой элемент?
относительно моего другого вопроса: XML десериализует нулевые элементы?
У меня есть такие элементы от стороннего сервера для тестирования API:
<Taxable />
<DefaultPurchasePrice />
Я только что понял, что теперь я путаю себя о том, представляют ли такие элементы нулевой объект или пустой.
говоря об объектах, они одинаковы, нулевой объект обычно означает пустую ссылку на объект справа? Но пытаясь сопоставить элемент XML с полем данных/значением, они могли бы будь другим я.e нулевая строка-пустая строка, но для десятичной цены или логического значения они не определены, которые равны пустым, но не будут нулевыми, если они не определены как nullable.
опять же, проблема с моим XmlSerializer заключается в том, что он не будет обрабатывать передачу пустого элемента. могу ли я легко исправить это в своем коде. Или я должен попросить людей предоставить XML иметь четко определенный XML? Потому что кажется, что пустой элемент XML не определен: он здесь, но может быть либо null, либо empty не имеет значения для самого элемента XML? Но для этого элемента мой код должен выяснить, как с этим справиться, если я не установлю все поле данных класса C# как строковый тип. В противном случае, если мой код пытается напрямую сопоставить пустой или нулевой элемент XML с определенным полем данных, он точно потерпит неудачу.
Я должен задать этот вопрос, потому что я столкнулся с XML есть много таких элементов и для этих специальных элементов мой код .NET XMLserialization должен сопоставлять эти поля как string и если строка не пуста, я помещаю их в соответствующий тип данных, иначе я устанавливаю их в null. И я в конечном итоге удаляю этот пустой элемент перед десериализацией, потому что это намного проще. Но я блуждаю: "что я действительно делаю в своем коде? я только что удалил нулевые элементы или пустые элементы? Потому что они явно разные! но люди, пишущие, что XML думают, что они одинаковы, потому что сам XML не имеет понятия "null", и некоторые люди утверждают, что это моя ответственность-решить, является ли он нулевым или пустым. Но XML позволяет вам представляют "нулевые" элементы более четким способом
изменить:
в Примере, который я представил, эти два элемента явно должны быть null, а не пустыми элементами. XML на самом деле не имеет понятия null, но эти элементы могут быть либо опущены (если они null, не помещайте их в XML), либо использовать лучшее представление, как упоминалось в @svick. Или в других случаях, пустой элементы должны использоваться, когда они имеют смысл. Но не для Decimal или Boolean.
2 ответов
что это: null или пустой элемент?
это пустое. Это семантически то же самое, что:
<Taxable></Taxable>
<DefaultPurchasePrice></DefaultPurchasePrice>
единственное понятие "null", существующее в самом XML, является отсутствующим элементом. Вы не можете указать элемент и скажем, что это null, используя семантику XML. У вас должна быть какая-то схема (явная схема, такая как DTD, XSD или Schematron, или неявная / логическая схема) для этого.
это не ограничивает приложение, которое интерпретирует XML или официальные технологии, связанные с XML. Например, XSD имеет
Я думаю, что это сводится к тому, что нет сопоставления по умолчанию между XML и объектной моделью вашего любимого языка. Рассмотрим следующий XML:
<Person Name="John">
<Father>
<Person Name="Jim" />
</Father>
<Mother>
<Person Name="Jenny" />
</Mother>
</Person>
тут Person
свойства (или поля) Father
и Mother
? Или Person
представляют коллекцию, которая может содержать объекты типов Father
и Mother
(возможно наследование от абстрактного базового типа FamilyMember
)? Это не ясно из XML, и вам решать, как вы представляете это в своем объектная модель. (Наличие схемы несколько изменит это, но все же оставляет место для интерпретации.)
аналогично, понятие null
отсутствует в XML. С другой стороны, понятие пустого элемента не сопоставляется непосредственно с объектной моделью. И они не одинаковы, пустой элемент все еще может иметь атрибуты и имеет "тип" (имя элемента).
как правило, я думаю, что хорошее решение-иметь специальный элемент XML, представляющий null
(<Null />
), но другое решение может иметь больше смысла в вашем конкретном случае.