Разбор Xsd для атрибутов в C # - PullRequest
3 голосов
/ 20 марта 2012

Я пытаюсь проанализировать пользовательский XSD для создания списка элементов, для которых определены пользовательские атрибуты. Я вставил образец узла из моего XSD ниже. В моем случае я пытаюсь создать список всех элементов (простых и сложных типов), которые были помечены как статические. Образец -

    <xs:element name="ATestEnum">
      <xs:annotation>
        <xs:appinfo>
          <ConfigurationMemberMetadata>
            <Static>False</Static>
          </ConfigurationMemberMetadata>
        </xs:appinfo>
      </xs:annotation>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Sample1" />
          <xs:enumeration value="Sample2" />
        </xs:restriction>
      </xs:simpleType>
    </xs:element>

Я просто не могу найти способ запросить «внутри» элемента для нужных мне свойств. Я дошел до этого -

var doc = XDocument.Load(schemaFileName);            
foreach (var element in doc.Descendants(xs + "element"))
{
    Console.WriteLine(element.Attribute("name").Value);
}

Это дает мне список всех элементов в xsd, но не конкретное свойство (ConfigurationMemberMetadata), которое мне нужно проверить. Я вижу метод element.Annotation (type), но как мне привести его к извлечению полей, которые я ищу?

Я также пытался использовать XmlTextReader и читать схему, компилировать набор схем и перебирать элементы, но это тоже не помогает.

Может ли кто-нибудь указать мне правильное направление? Я очень новичок в разборе XML и буду очень признателен за вашу помощь! Спасибо.

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Вы должны использовать что-то вроде этого:

XmlReader reader = XmlReader.Create(@"D:\....\your-file.xsd");
XDocument doc = XDocument.Load(reader);
XmlNamespaceManager ns = new XmlNamespaceManager(reader.NameTable);
ns.AddNamespace("", "http://tempuri.org/XMLSchema.xsd");
XNamespace xs = "http://www.w3.org/2001/XMLSchema";
foreach (var element in doc.Descendants(xs + "element")) { Console.WriteLine(element.Attribute("name").Value); }
foreach (XElement element in (IEnumerable)doc.XPathEvaluate("//ConfigurationMemberMetadata")) { Console.WriteLine(element.Name); }

Аннотации не отображаются в информационном наборе, они являются чем-то другим.Чтобы добраться до вашего элемента, используйте XPath.

Обратите внимание на одну вещь - это пространство имен, которое вы ассоциируете с префиксом.Как правило, в файле XSD пространство имен по умолчанию соответствует целевому пространству имен, поэтому я установил фиктивное пространство имен - обновите, чтобы оно соответствовало вашему.Если у вас нет пространства имен по умолчанию, просто установите в uri также пустую строку.

Вот XSD, который я использовал с кодом выше:

<?xml version="1.0" encoding="utf-8" ?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ATestEnum"> 
        <xs:annotation> 
            <xs:appinfo> 
                <ConfigurationMemberMetadata> 
                    <Static>False</Static> 
                </ConfigurationMemberMetadata> 
            </xs:appinfo> 
        </xs:annotation> 
        <xs:simpleType> 
            <xs:restriction base="xs:string"> 
                <xs:enumeration value="Sample1"/> 
                <xs:enumeration value="Sample2"/> 
            </xs:restriction> 
        </xs:simpleType> 
    </xs:element>
</xs:schema>
2 голосов
/ 20 марта 2012

Используйте запрос Xpath для выборочного поиска только тех узлов, которые вас интересуют («статические» узлы).

Вот хороший пример того, как это сделать: http://support.microsoft.com/kb/308333

Если вам нужна практика с XPath, используйте этот «тестовый стенд», чтобы ознакомиться с его синтаксисом: http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

Используя ваш пример XML, этот запрос Xpath найдет все «статические» узлы:

/xml/xs:element/xs:annotation/xs:appinfo/ConfigurationMemberMetadata/Static
...