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 />), но другое решение может иметь больше смысла в вашем конкретном случае.