Удалить пространство имен для свойства типа объекта в .NET XML-сериализации в API - PullRequest
0 голосов
/ 01 сентября 2018

Как я могу получить это неестественное пространство имен в этом свойстве XML? Это может быть десятичное или целое число.

<Score xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:double">2.5</Score>

Должно быть

<Score>2.5</Score>

Класс

[DataContract(Name = "Participant", Namespace = "")] 
public class ApiGameParticipant
{
    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public object Score { get; set; }

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Предположительно, префикс пространства имен "i" в некотором содержащем элементе связан с http://www.w3.org/2001/XMLSchema-instance. Если это так, то ваш документ не будет действительным для xsd-schema, если вы удалите объявление пространства имен d6p1. Это связано с тем, что атрибут xsi:type (как его обычно пишут) должен быть QName, и чтобы быть действительным QName, префиксная часть (в данном случае d6p1) должна быть объявлена.

Теперь, возможно, вам не требуется, чтобы ваш документ был действительным для схемы. В этом случае я бы избавился и от атрибута i:type. Сохранение атрибута, но потеря объявления пространства имен, которое придает ему значение, кажется действительно плохой идеей.

Если вы хотите избавиться от атрибута и пространства имен, с XSLT это достаточно просто.

СПУСТЯ

Глядя на ваш вопрос более внимательно, я вижу, что вы действительно хотите избавиться как от атрибута, так и от объявления пространства имен. Код XSLT для этого (для всех элементов):

<xsl:template match="*">
  <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="@*|*"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="@i:type"
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>

Первое правило копирует элементы без изменений, но без сохранения неиспользуемых пространств имен; второе правило копирует атрибуты без изменений; третье правило удаляет атрибут i:type.

0 голосов
/ 01 сентября 2018

Если вам нужно, чтобы ваш XML выглядел в точности как что-то, или если вы хотите удалить пространство имен, тогда вам лучше использовать XmlSerializer. DataContractSerializer не дает вам такой же уровень контроля, как предполагается, что вы используете его на обоих концах - и пространство имен имеет решающее значение в этом отношении, поскольку оно касается последовательной сериализации и десериализации типов.

...