(un) Правильная ссылка на пространства имен в элементе XTypedElement - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть элемент, который наследуется от XTypedElement (генерируется с помощью LinqToXsd). У него есть строковое свойство, определенное так:

public string lang {
  get {
    XAttribute x = this.Attribute(XName.Get("lang", "xml"));
    return XTypedServices.ParseValue<string>(x, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
  }
  set {
    this.SetAttribute(XName.Get("lang", "xml"), value, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
  }
}

Первоначально он был сгенерирован с помощью XName.Get ("lang"), но я добавил пространство имен "XML", потому что вывод должен выглядеть следующим образом:

<tag xml:lang="nl-NL">...</tag>

вместо этого я теперь получаю это:

<tag p1:lang="nl-NL" xmlns:p1="xml">...</tag>

Следующее может быть совершенно не связано, но я знаю, как решить эту проблему, используя старый класс System.Xml.Serialization.XmlSerializer. Там вы можете указать некоторые пространства имен при вызове метода Serialize. ToString () XTypedElement не имеет перегрузки, где я могу указать такие пространства имен. У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 19 сентября 2011

Отвечая на мой собственный вопрос: после того, как я немного погуглил, я нашел это (и это помогло):

XName.Get("lang", XNamespace.Xml.NamespaceName)

Мне было интересно, что это возвращало (есть только одна перегрузка и это строка), поэтому я поставил на нее точку останова и прочитал значение XNamespace.Xml.NamespaceName. это было "http://www.w3.org/XML/1998/namespace". Каким-то образом Linq-to-xml, кажется, знает, как это относится к" xml ": -)

Правильно работающий код теперь выглядит так:

public string lang {
  get {
    XAttribute x = this.Attribute(XName.Get("lang", XNamespace.Xml.NamespaceName));
    return XTypedServices.ParseValue<string>(x, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
  }
  set { 
    this.SetAttribute(XName.Get("lang", XNamespace.Xml.NamespaceName), value, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
  }
}
...