Извлечь значения перечисления из файла XSD? - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь извлечь значения перечисления из файла xsd, но мне не удается, и ниже приведен единственный код, который помогает мне получить только числовое значение.

XSD-файл:

<xsd:simpleType name="PackageTypeCodeContentType">
<xsd:restriction base="xsd:token">
  <xsd:enumeration value="43">
    <xsd:annotation>
      <xsd:documentation xml:lang="en">
        <ccts:Name>Bag, super bulk</ccts:Name>
      </xsd:documentation>
    </xsd:annotation>
  </xsd:enumeration>
  <xsd:enumeration value="44">
    <xsd:annotation>
      <xsd:documentation xml:lang="en">
        <ccts:Name>Bag, polybag</ccts:Name>
        <ccts:Description>A type of plastic bag, typically used to wrap promotional pieces, publications, product samples, and/or catalogues.</ccts:Description>
      </xsd:documentation>
    </xsd:annotation>
  </xsd:enumeration>
  <xsd:enumeration value="1A">
    <xsd:annotation>
      <xsd:documentation xml:lang="en">
        <ccts:Name>Drum, steel</ccts:Name>
      </xsd:documentation>
    </xsd:annotation>
  </xsd:enumeration>...

Код, который я пытался использовать:

XmlSchema schema = XmlSchema.Read(XmlReader.Create("XsdLookups\\PackageType.xsd"), ValidationCallbackOne);
        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.Add(schema);
        schemaSet.Compile();
        var results = schema.Items.OfType<XmlSchemaSimpleType>().Where(s => (s.Content is XmlSchemaSimpleTypeRestriction) && s.Name == "PackageTypeCodeContentType").ToList();
        var enumValues = results.SelectMany(c => ((XmlSchemaSimpleTypeRestriction)c.Content).Facets.OfType<XmlSchemaEnumerationFacet>().Select(d => d.Value));
        enumValues.ToList().ForEach(p=> Debug.WriteLine(p));

Я пытаюсь извлечь имя и описание документации xsd, например "Сумка, супер объем" и т. Д.

1 Ответ

0 голосов
/ 03 июля 2018

Хотя это и не так элегантно, я использовал старый добрый Xml.Linq:

XDocument schema = XDocument.Load(xsdPath);
        XNamespace xs = schema.Root?.Name.Namespace;
        var enumerations = schema
            .Root?
            .Descendants(xs + "simpleType")
            .Where(t => (string) t.Attribute("name") == simpleTypeName)
            .Descendants(xs + "enumeration")
            .ToList();
        foreach (var element in enumerations)
        {
            var annotation = element.Elements().ElementAt(0);
            var documentationElement = annotation.Elements().ElementAt(0);
            //
            var nameValue = documentationElement.Elements().ElementAt(0).Value;
            var decsValue = documentationElement.Elements().ElementAtOrDefault(1)?.Value;

            addMethod.Invoke(nameValue, decsValue);
        }

Пожалуйста, поделитесь, если у кого-то есть лучший способ сделать это.

...