Re[2]: Разбор XSD
От: Аноним  
Дата: 19.03.14 07:47
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Здравствуйте, Аноним.


K>Загружаем xml в XDocument. Получаем коллекцию потомков. Выводим все атрибуты.


K>
K>var text = @"<?xml version=""1.0"" encoding=""UTF-8""?><xsd:schema xmlns:cite=""http://www.opengeospatial.net/cite"" xmlns:gml=""http://www.opengis.net/gml"" xmlns:it.geosolutions=""http://www.geo-solutions.it"" xmlns:nurc=""http://www.nurc.nato.int"" xmlns:sde=""http://geoserver.sf.net"" xmlns:sf=""http://www.openplans.org/spearfish"" xmlns:tiger=""http://www.census.gov"" xmlns:topp=""http://www.openplans.org/topp"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" elementFormDefault=""qualified"" targetNamespace=""http://www.census.gov"">
K>  <xsd:import namespace=""http://www.opengis.net/gml"" schemaLocation=""http://localhost:8090/geoserver/schemas/gml/3.1.1/base/gml.xsd""/>
K>  <xsd:complexType name=""poly_landmarksType"">
K>    <xsd:complexContent>
K>      <xsd:extension base=""gml:AbstractFeatureType"">
K>        <xsd:sequence>
K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""the_geom"" nillable=""true"" type=""gml:MultiSurfacePropertyType""/>
K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""LAND"" nillable=""true"" type=""xsd:double""/>
K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""CFCC"" nillable=""true"" type=""xsd:string""/>
K>          <xsd:element maxOccurs=""1"" minOccurs=""0"" name=""LANAME"" nillable=""true"" type=""xsd:string""/>
K>        </xsd:sequence>
K>      </xsd:extension>
K>    </xsd:complexContent>
K>  </xsd:complexType>
K>  <xsd:element name=""poly_landmarks"" substitutionGroup=""gml:_Feature"" type=""tiger:poly_landmarksType""/>
K></xsd:schema>";

K>var xml = XDocument.Parse(text);
K>XNamespace ns = "http://www.w3.org/2001/XMLSchema";

K>var elems = xml.Descendants(ns + "element"); // коллекция всех узлов element

K>foreach (var elem in elems)
K>{
K>    foreach (var attr in elem.Attributes()) // все атрибуты
K>        Console.WriteLine(attr);
K>    Console.WriteLine();
K>}
K>


В этом варианте 2 проблемы:
1) Вы получаете не только element, но и element, который является complexType.

вывод должен быть таким:
  • the_geom
  • LAND
  • CFCC
  • LANAME

    у вас:
  • the_geom
  • LAND
  • CFCC
  • LANAME
  • poly_landmarks

    2) Namespace неизвестен при разборе.

    K>Или получаем конкретный элемент и конкретный атрибут.


    K>
    K>var poly_landmarks = xml.Root.Element(ns + "complexType");
    
    K>foreach (var elem in poly_landmarks.Descendants(ns + "element"))
    K>{
    K>    Console.WriteLine(elem.Attribute("name").Value);
    K>}
    K>


    При таком подходе мы пропускаем возможные element в корне (не относится к приведенному примеру, там в корне только complexType).
    Ну и опять же мы не знаем Namespace.
  •  
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.