Tag Archives: XML

Visual Studio:“The XY has already been declared.“ (XSD)

Pokud ve Visual Studiu editujete XML soubory, ke kterým máte XSD schema, můžete se dočkat hlášek typu:

  • The global element ‚…‘ has already been declared.
  • The complexType ‚…‘ has already been declared.
  • apod.

XSD

Potíž je v tom, že Visual Studio se snaží schema XML souboru validovat vůči XSD souborům z celé solution (dle namespace). Pokud máte tedy odpovídající XSD soubor v solution vícekrát, výsledkem jsou výše uvedené kolize.

Update: XML Schemas

Zbyněk Řešetka (děkuji) mě nasměroval na původní správné řešení, o kterém jsem si myslel, že ve VS2015 zmizelo – dialog XML Schemas, kde si aktivní schema navolíte, i když máte XSD soubor v solution vícekrát:

 

Schemas.png

Přístupný je přes menu XML / Schemas… Záludnost, která mě zmátla, spočívá v tom, že toto menu existuje pouze pokud je otevřen XML soubor a nastavení schemat se nedá vyloudit ani přes Quick Launch.

Jak se zbavit namespaces (xmlns) v rootovém elementu XML při serializaci

Při běžné serializaci objektu do XML nám XmlSerializer vytvoří root-element, který má nastavené namespaces, např.

<rootElement xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

To odpovídá XML normě. Může však nastat situace, např. při generování RSS Feedu, kdy namespace definovat nechceme.

Fígl, jak se zbavit namespace definice, spočívá v předhození XmlSerializeru kolekce XmlSerializerNamespaces s jednou „prázdnou“ položkou:

XmlSerializer serializer = new XmlSerializer(typeof (RssFeed));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", null);
StringWriter writer = new StringWriter(CultureInfo.CurrentCulture);
serializer.Serialize(writer, this, ns);

…a je to, výsledné XML bude mít kořenový element jen

<rootElement>
  ...
</rootElement>