Порядок сортировки XmlSchemaElement в C#

Я сравниваю два XMLs на основе того же самого XMLSchema. У каждого Элемента в xml есть id (в id ничто не говорится о заказе - у самого старого xmlElement есть самый низкий id и так далее). Моя цель состояла бы в том, чтобы получить вид выравнивания между двумя XMLS.

Дать очень простой пример. Позвольте там быть двумя xmls. Первый походит на это:


    
    
    
    

и второй как это:


    
    
    
    

Мой результат должен быть отображением ид. Это начнется приятно с 1:1, тогда 2:2, 100:100. В данный момент я сталкиваюсь с двумя xml элементами с отличающимися именами. Я знаю, что они не могут быть подобраны, таким образом, эти два возможных решения состояли бы в том, чтобы взять 3:* (где * = символ ни для какого матча) и затем *:4 или взять :4 и затем 3: . НО только один путь - правильное решение, потому что в схеме говорится, что UnknownOrderEle2 (id=4) должен прибыть перед UnknownOrderEle1 (id=3.

Таким образом, я искал что-либо в классе XmlSchema, XmlSchemaInfo , XmlSchemaElement ... который говорит мне что-либо о заказе элемента. Эти только две возможности, которые я нашел, не являются никакими действительными решениями для меня, так как они или слишком трудоемкие или грязные. Нужно было бы сравнить LineNumber и LinePosition в XmlSchemaObject (вероятно, грязный). Другой должен был бы построить xml из двух xmls и утвердить его. Если это бросает исключение проверки правильности, я знаю, что заказ, который я выбрал, был неправильно (определенно трудоемким).

Я был бы рад получить любую помощь, если кто-либо знает лучшее решение.

0
nl ja de

1 ответы

Схема, соответствующая вашему примеру, должна содержать что-то вроде этого:


  
    
      
        . . .
      
      
        . . .
      
      
        . . .
      
      
        . . .
      
      
        . . .
      
    
  

После того, как загруженный, можно овладеть передачей XmlSchemaElement объект и затем заказа его подэлементов с некоторым кодом как это:

XmlSchemaElement element = schema.Elements[new XmlQualifiedName("EleType")];
XmlSchemaType complexType = (XmlSchemaComplexType)element.ElementSchemaType;
XmlSchemaSequence sequence = (XmlSchemaSequence)complexType.Particle;
XmlSchemaObjectCollection childElements = sequence.Items;

childElements is the list of the valid sub-elements Ele, Name, Description, UnknownOrderEle1, UnknownOrderEle2, in the correct order.

Это работает, пока ваша схема проста, но если определение типов не простые последовательности, но более сложный - с выбор , группы и так далее, это становится намного более сложным, до такой степени, что другой подход, чтобы создать XML-файл и попытаться утвердить его становится, вероятно, лучше.

0
добавлено
Спасибо за быстрый ответ. Моя схема более сложна, но сравнения также - очень ограничивающий фактор. Я сравниваю сотни XMLs рекурсивно, таким образом, я просто can' t утверждают каждое возможное, сравнивают различие. I' ll пробуют более сложный подход согласно вашему решению и отправят его здесь, если это не слишком длинно;-)
добавлено автор Akrostichon, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot