XML, что это: нулевой или пустой элемент? - PullRequest
10 голосов
/ 30 августа 2011

По поводу другого моего вопроса: XML десериализует нулевые элементы?

У меня есть такие элементы от стороннего сервера для тестирования API:

<Taxable />
<DefaultPurchasePrice />

Я только что понял, что сейчас я путаюсь с тем, представляют ли такие элементы нулевой объект или пустой.

Говоря об объектах, они одинаковы, нулевой объект обычно означает пустую ссылку на объект, верно? Но, пытаясь отобразить элемент XML в поле данных / значение, они могут отличаться, т. Е. Пустая строка является пустой строкой, но для десятичной цены или логического значения они не определены, что равно пустому, но не будет нулевым, если только они не определены как обнуляемый.

Опять же, проблема с моим XmlSerializer в том, что он не обрабатывает передачу пустого элемента, подобного этому. Могу ли я легко исправить это в моем коде. Или я должен спросить людей, чтобы у XML был четко определенный XML? Потому что кажется, что такой пустой элемент XML не определен: он здесь, но может быть либо нулевым, либо пустым, не имеет значения для самого элемента XML? Но для этого элемента мой код должен выяснить, как с этим справиться, если я не установлю все свое поле данных класса C # как строковый тип. В противном случае, если мой код попытается напрямую сопоставить пустой или нулевой элемент XML с определенным полем данных, он обязательно потерпит неудачу.

Я должен задать этот вопрос, потому что я столкнулся с тем, что в XML много таких элементов и для этих специальных элементов мой код .NET XML-сериализации должен отображать эти поля как строки, и если строка не пустая, я помещаю их в соответствующий тип данных, в противном случае я устанавливаю их в null. И я заканчиваю тем, что удаляю эти пустые элементы перед моей десериализацией, потому что это намного проще. Но я делаю блуждание: «Что я действительно делаю в своем коде? Я просто удалил нулевые элементы или пустые элементы? Потому что они явно разные! Но люди, пишущие этот XML, думают, что они одинаковы, потому что сам XML Я не имею понятия «ноль», и некоторые люди утверждают, что я обязан решить, является ли он пустым или пустым. Но XML действительно позволяет вам представлять «нулевые» элементы более ясным способом

Edit:

В представленном мною примере эти два элемента должны быть нулевыми, а не пустыми. XML на самом деле не имеет понятия нуля, но эти элементы могут быть либо опущены (если они нулевые, не помещайте их в XML), либо использовать лучшее представление, как упомянуто как @svick. Или в других случаях, пустые элементы должны использоваться, когда они имеют смысл. Но не для десятичного или логического.

Ответы [ 2 ]

16 голосов
/ 31 августа 2011


что это: нулевой или пустой элемент?

Он пуст.Семантически это то же самое, что и:

<Taxable></Taxable>
<DefaultPurchasePrice></DefaultPurchasePrice>

Единственная «нулевая» концепция, которая существует в самом XML, - это отсутствующий элемент.Вы не можете указать элемент и , чтобы сказать, что это нуль, используя семантику XML.Для этого у вас должна быть какая-то схема (явная схема, такая как DTD, XSD или Schematron, или неявная / логическая схема).

Это не ограничивает приложение, которое интерпретирует XML, хотяили официальные технологии, связанные с XML.Например, XSD имеет атрибут xsi:nil="true".Даже если вы можете применить некоторые из этих атрибутов схемы к XML, эти атрибуты не являются «чистым» XML;Они являются дополнением, предоставляемым схемами XSD.

Это тот случай, когда XSD мог свободно строить свою собственную семантику поверх базовой структуры XML и добавлять явную nil там, где ее не было.Такая гибкость считается преимуществом XML.

2 голосов
/ 30 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...