Should missing enumerated XML attributes always defaulted in? - c#

If an attribute that is defined as an enumerated list is missing from an XML element should the first value in the list be used as a default if it doesn't have a default specified?
I have the following in a schema:
<xsd:simpleType name="YesNoType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="yes"/>
<xsd:enumeration value="no"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="TelephoneStructure">
<xsd:sequence>
<xsd:element name="TelNationalNumber" type="core:TelephoneNumberType"/>
<xsd:element name="TelExtensionNumber" type="core:TelephoneExtensionType" minOccurs="0"/>
<xsd:element name="TelCountryCode" type="core:TelCountryCodeType" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="TelUse" type="core:WorkHomeType"/>
<xsd:attribute name="TelMobile" type="core:YesNoType"/>
<xsd:attribute name="TelPreferred" type="core:YesNoType"/>
</xsd:complexType>
I have generated C# types from the above schema. I expected that missing attributes would result in null values, but I find that missing attributes default to the first value in the list, is this correct according to the XML spec?

Only TelExtensionNumber and TelCountry code are optional according to your schema. Everthing else is not optional, and so will assume the default value (0 for int, null for classes).
How to make an element in XML schema optional?

Related

WSDL The data type 'xxxx: AuthorizationFilter' does not exist

I am trying to generate classes from WSDL using visual studio Developer command prompt for vs2017.
I am using the command :
wsdl.exe xxx.wsdl file.xsd file2.xsd .....
the WSDL is created in Java and I trying to connect to WSDL from c# project but I get always the same problem:
Error: The xxxServicePortBinding binding of namespace 'urn:
xxx3Services-1-1-0' cannot be imported.
- The login process cannot be imported.
- The data type 'urn: xxxxServiceTypes-1-1-0: AuthorizationFilter' does not exist.
I went to xsd "xxxxServiceTypes-1-1-0" and the code of AuthorizationFilter is like:
<xsd:complexType name="DeclareEndpointRequest_Type">
<xsd:annotation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="VUNr" type="omds:VUNr" minOccurs="0"/>
<xsd:element name="BasisUrlEndpoint">
<xsd:annotation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="1000"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element ref="ArtAuthentifizierung"/>
<xsd:element name="Credentials" type="Credentials_Type">
<xsd:annotation>
</xsd:annotation>
</xsd:element>
<xsd:element name="AuthorizationFilter" type="cst:AuthorizationFilter" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
Is there is any tipp that could help me to generat classes from thee WSDL.
The answer was that I should insert the reference of the source of AuthorizationFilter in my project in my case it was the system.web.mvc

How to parse XSD file using c#

I want to read XSD File. But unable to find a proper way to parse XSD file.
<xsd:group name="group_name">
<xsd:annotation>
<xsd:documentation>Some text is here</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element minOccurs="0" name="Element_1" type="string">
<xsd:annotation>
<xsd:documentation>Some text is here</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element minOccurs="0" name="Element_2" type="string">
<xsd:annotation>
<xsd:documentation>Some text is here</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:group>
I want to read each group in my file, a sequence in that group and element in that sequence. And also need to read annotation of each group, I can element.
How can I do that?
XSD File are XML file, so you can read ot using XML parser such as LINQ which is a query to read data from data source, the link bellow is a good source about it:
https://msdn.microsoft.com/en-us/library/bb397933.aspx
So, the first step is to load the xml file then read it by LINQ query

Internationalisation with asp.net, c# and VSCode

I would like to create an internationalization file in my asp.net project using VS Code. I just found how to do it using a common VS version, just creating a .resx file, and using a specific interface to insert the variables and the value.
How can I create an internationalization file using Visual Studio Code?
Visual Studio Code is not an IDE. It's a Code Editor. So you can't add new item types like you get that menu with the full Visual Studio. Instead, you can add text files, give them the proper extension, and fill them out accordingly.
A resource file is .resx, and here's a starter one made with Visual Studio Community that you can use:
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MyString" xml:space="preserve">
<value>My Value</value>
<comment>My Comment</comment>
</data>
</root>
Resx files are only going to partially function in VS Code.
Typically, a resx file produces two artifacts: an embedded resource in your assembly, and a code file containing APIs to access your resources by name.
The embedded resource is created from an MSBuild task, so it will be handled as long as you are building with MSBuild, which is pretty standard for any .NET project.
However, the code file that gets generated is created by a "Custom Tool" in Visual Studio, so you won't get that for free if you use VSCode. This generated code file can be written by hand, but it isn't much fun keeping it in sync with your .resx.
As an alternative to .resx, I've been working on creating a .resj file format. This functions entirely in MSBuild, and so should work just as well from VSCode as it does from Visual Studio. The project is open sourced here. I've packaged it up as a nuget package "Elemental.JsonResource" (currently only pre-release). If you add that package to your project you should be able to use .resj files. Currently, it only supports string resources, but I hope to add support for other resource types in the future. It doesn't add a run-time dependency to your project, it only operates at build time.

xsd to c# without included xsd

To generate classes from xsd file is it necessary need included/imported xsd? Is possible to generate it without included/imported xsd? Because I want write own xsd to C# classes generator.
<?xml version="1.0"?>
<xsd:schema xmlns="" xmlns:Extended="" xmlns:xsd="" targetNamespace="">
<xsd:include schemaLocation="file2.xsd"/>
<xsd:import namespace="" schemaLocation="file2.xsd"/>
<xsd:complexType name="ActualEndTimeType">
<xsd:simpleContent>
<xsd:restriction base="DateTimeType"/>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="ActualFinishTimeType">
<xsd:simpleContent>
<xsd:restriction base="DateTimeType"/>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="ActualStartTimeType">
<xsd:simpleContent>
<xsd:restriction base="DateTimeType"/>
</xsd:simpleContent>
</xsd:complexType>
<-- etc... -->
</xsd:schema>

Turn off CXF Aegis Inheritance support / Use Inheritance with DataContractSerializer?

I use Apache CXF with Aegis data binding to provide a Java web service to a C# client. This works in principle very well. On the C# side, I would like to use the more limited DataContractSerializer, because it allows for collections instead of arrays. I understand using the DataContractSerializer limits the complexity of the Aegis-generated WSDL. Now I have a Java type that uses inheritance. Aegis is able to generate a WSDL that contains both the base and the derived type, but the DataContractSerializer does not seem to be able to understand this WSDL. SvcUtil falls back to the XmlSerializer, and my collections get ugly arrays.
I can imagine thee theoretical possibilities to deal with this issue:
Turn off Inheritance support with Aegis. This should cause the WSDL to contain only the derived types, containing each all of the base type properties.
Somehow make DataContractSerializer understand WSDL inheritance
Somehow make XmlSerializer use collections instead of arrays
I think the last two options are not possible, so I am stuck with the first one. How can I turn off Aegis inheritance?
Example WSDL fragment:
<xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://tables.basic.meona.de">
<xsd:complexType abstract="true" name="BaseTreeNode">
<xsd:sequence>
<xsd:element minOccurs="0" name="active" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="category" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="name" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="sequenceNumber" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<xsd:complexType name="EmergencyDiagnosis">
<xsd:complexContent>
<xsd:extension base="ns0:BaseTreeNode">
<xsd:sequence>
<xsd:element minOccurs="0" name="externalCode" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="favoriteDiagnosis" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="identifier" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
It seems former versions of Aegis did not generate the extension, so I am hoping it can be switched off: https://issues.apache.org/jira/browse/CXF-5176
After reading the Aegis source code, I helped myself with the following hack:
public class AegisNonExtensionBeanType extends BeanType {
#Override
public BeanTypeInfo getTypeInfo() {
BeanTypeInfo bti = super.getTypeInfo();
bti.setExtension(false);
bti.setExtensibleAttributes(false);
bti.setExtensibleElements(false);
return bti;
}
#Override
public AegisType getSuperType() {
return null;
}
}
If I register this AegisType for my inherited beans, it works.
Mustn't there be a better way?

Categories

Resources