Могу ли я указать схему для создания XDocument при загрузке XML-файла? - PullRequest
1 голос
/ 04 января 2012

Я новичок в xml, пытаюсь создать тип XDocument из файла xml.

Я могу проверить xml по схеме.

public class XmlHandler
{
    public XDocument Read(string filename, string schemaname)
    {
        var schemas = this.GetSchemas(schemaname);
        var doc = XDocument.Load(filename);

        var invalid = false;
        doc.Validate(schemas,
            (o, args) =>
                {
                    this.OnValidationErrors(o, args);
                    invalid = true;
                });

        return invalid ? new XDocument() : doc;
    }

    public XmlSchemaSet GetSchemas(string schemaname)
    {
        var schemas = new XmlSchemaSet();
        schemas.Add(null, schemaname);
        return schemas;
    }

    private void OnValidationErrors(object sender, ValidationEventArgs e)
    {
        Debug.Print("Errors: ", e);
    }
}

Но структура XDocumentкажется неправильным.

При запуске этого кода

    [Fact]
    public void Read_get_elements()
    {
        var sut = new XmlHandler();

        var result = sut.Read(this.TestFile, this.TestFileSchema);

        var root = result.Root;
        var elements = result.Elements();
        var nodes = result.Nodes();
        var descendants = result.Descendants();

        Assert.NotEmpty(elements);
    }

корневая переменная содержит полную строку XML, а остальные переменные IEnumerable остаются пустыми.Чего мне не хватает?

РЕДАКТИРОВАТЬ: Это часть XML и XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       targetNamespace="https://www.eurexchange.com/members/releases/eurex14/manuals_technical_en.html" 
       xmlns="https://www.eurexchange.com/members/releases/eurex14/manuals_technical_en.html" 
       elementFormDefault="qualified">

  <xs:include schemaLocation="eurex_reports_common_structs.xsd"/>

  <xs:complexType name="cb020Type">
    <xs:annotation>
      <xs:documentation>CB020 Position Summary</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="rptHdr" type="rptHdrType" />
      <xs:element name="cb020Grp" type="cb020GrpType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="cb020" type="cb020Type"/>

  <xs:complexType name="cb020GrpType">
    <xs:sequence>
      <xs:element name="cb020KeyGrp" type="cb020KeyGrpType" />
      <xs:element name="cb020Grp1" type="cb020Grp1Type" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

И это часть XML

<?xml version="1.0" encoding="UTF-8"?>
<cb020 xmlns="https://www.eurexchange.com/members/releases/eurex14/manuals_technical_en.html">
  <rptHdr>
    <exchNam>EUREX</exchNam>
    <envText>P</envText>
    <rptCod>CB020</rptCod>
    <rptNam>Position Summary</rptNam>
    <membLglNam>Cyberdyne Systems</membLglNam>
    <rptPrntEffDat>2011-12-05</rptPrntEffDat>
    <rptPrntRunDat>2011-12-05</rptPrntRunDat>
  </rptHdr>
  <cb020Grp>
    <cb020KeyGrp>
      ...
    </cb020KeyGrp>
    <cb020Grp1>
      ...
    </cb020Grp1>
  </cb020Grp>
</cb020>

1 Ответ

1 голос
/ 24 января 2012

Не видя другого пути, я создал классы из xsd с помощью замечательного инструмента Xsd2Code Используя сериализатор, я могу получить все данные из XML в граф объектов.Это решило мою проблему, даже если не ответило на мой вопрос.

...