Эффективный алгоритм для сравнения узлов XML

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

Настройка потока аутентификации пула пользователей

Я столкнулся с 2 неправильными частями в документация здесь (подстраницы триггеров) и 1 ошибка с моей стороны.

Неправильная часть 1: входные данные DefineAuthChallenge и CreateAuthChallenge для сеанса определены как список результатов испытаний. Это все нормально, но объект результата запроса имеет неправильно отображаемую часть метаданных вызова, которая записывается так: «ChallengeMetaData», когда вместо этого должно быть «ChallengeMetadata», с строчным «d» вместо «data» вместо «data» верхний регистр один. Это дало мне ошибку «Нераспознанный лямбда-вывод», потому что «ChallengeMetaData» не был тем, чего ожидал сервер, он искал «ChallengeMetadata», которого не было. Когда вы в первый раз вводите лямбду define auth challenge, эта ошибка не отображается, потому что сеанс не содержит ответов на вызов. Однако, как только вы подтвердите вызов, он заполняется, и заглавная буква d доставляет вам неприятности.

Неправильная часть 2: Как описано в моем вопросе, вход VerifyAuthChallenge для «challengeAnswer» - это строка, а не словарь.

Все эти неправильные части правильно отображаются на первой странице документации, на которую я ссылаюсь здесь. Поэтому я бы рекомендовал использовать это вместо другой документации.

Ошибка на моей стороне: я действительно не проверял, что происходит после того, как вы проверите пользовательский вызов с помощью триггера VerifyAuthChallenge. В приведенной ссылке на изображении над заголовком «Лямбда-триггер DefineAuthChallenge: задачи (конечный автомат)» четко указано, что после проверки ответа снова запускается триггер DefineAuthChallenge, который я не рассматривал. [118 ]

Я надеюсь, что смогу сэкономить кому-то время, которое понадобилось мне, чтобы разобраться с этим: -)

13
задан Pero P. 31 July 2013 в 21:02
поделиться

5 ответов

Я рекомендовал бы против прокрутки Вашего собственного создания хеша, функционируют и вместо этого полагаются на встроенное XNodeEqualityComparer GetHashCode метод. Это гарантирует, что приняло во внимание атрибуты и порожденные узлы при создании результата и могло сэкономить Вам некоторое время также.

Ваш код был бы похож на следующее:

XNodeEqualityComparer comparer = new XNodeEqualityComparer();
XDocument doc = XDocument.Load("XmlFile1.xml");
Dictionary<int, XNode> nodeDictionary = new Dictionary<int, XNode>();

foreach (XNode node in doc.Elements("doc").Elements("node"))
{
    int hash = comparer.GetHashCode(node);
    if (nodeDictionary.ContainsKey(hash))
    {
        // A duplicate has been found. Execute your logic here
        // ...
    }
    else
    {
        nodeDictionary.Add(hash, node);
    }
}

Мой XmlFile1.xml:

<?xml version="1.0" encoding="utf-8" ?>
<doc>
  <node att="A">Blah</node>
  <node att="A">Blah</node>
  <node att="B">
    <inner>Innertext</inner>
  </node>
  <node>Blah</node>
  <node att="B">
    <inner>Different</inner>
  </node>
</doc>

nodeDictionary закончит тем, что содержал уникальный набор Узлов и их хешей. Дубликаты обнаруживаются при помощи Dictionary ContainsKey метод, передающий в хеше узла, который мы генерируем использование XNodeEqualityComparer GetHashCode метод.

Я думаю, что это должно быть достаточно быстро для Ваших потребностей.

11
ответ дан 1 December 2019 в 23:16
поделиться

Что относительно этого подхода:

Для всех <w:pPr> узлы в документе (я предполагаю, существует не больше чем один на <w:p>), свяжите все соответствующие данные (имена элементов, атрибуты, значения) в строку:

// string format is really irrelevant, so this is just a bogus example
'!w:keep-with-next@value="true"!w:spacing@w:before="10"@w:after="120"'

Сделайте так на алфавитном порядке, для составления переменного порядка документа.

Создайте набор с помощью этих строк в качестве ключа и ссылки на соответствующее <w:p> узел как значение.

В процессе выполнения этого при ударе точки, что данный ключ уже существует в наборе, Вы нашли абзац с теми же свойствами. Работа со списком узлов как значение набора, если Вы хотите продолжать собираться.

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

3
ответ дан 1 December 2019 в 23:16
поделиться

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

static int HashXElement(XElement elem)
{
    int hash = 23;

    foreach (XAttribute attrib in elem.Attributes())
    {
        int attribHash = 23;
        attribHash = attribHash * 37 + attrib.Name.GetHashCode();
        attribHash = attribHash * 37 + attrib.Value.GetHashCode();
        hash = hash ^ attribHash;
    }

    foreach(XElement subElem in elem.Descendants())
    {
        hash = hash * 37 + XmlHash(subElem);
    }

    hash = hash * 37 + elem.Value.GetHashCode();

    return hash;
}

Идеи состояли в том, чтобы сделать упорядочивание подузлов значительным, но упорядочивание атрибутов не значительный.

2
ответ дан 1 December 2019 в 23:16
поделиться

не прямой ответ на Ваш вопрос, но тесно связанный с тем, чего Вы пытаетесь достигнуть: взгляните на XmlDiff (электроинструменты .net XML)

0
ответ дан 1 December 2019 в 23:16
поделиться

Это очень сложно даже для определения правильно проблемы

"Когда два xml документа равны?"

Существует много причин этого:

  1. XML-документ является деревом, которое может иметь различные текстовые представления.
  2. Узлы только для пробела могут или не могут быть рассмотрены в сравнении
  3. Узлы комментария могут или не могут быть рассмотрены в сравнении
  4. Узлы PI могут или не могут быть рассмотрены в сравнении
  5. Лексические различия: или
  6. Различные префиксы могут быть связаны с тем же пространством имен в этих двух документах
  7. Узел пространства имен можно показать, как определено на узле doc1 и как не определенный, но наследованный от родителя соответствующего узла в doc2
  8. Кавычки могут использоваться вокруг атрибута в doc1, но апострофы могут использоваться в doc2
  9. Объекты могут использоваться в doc1, но они могут быть предварительно расширены в doc2
  10. Эти два документа могут иметь различные но семантически эквивалентные ДАТЫ
  11. И т.д.

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

Моя рекомендация состоит в том, чтобы использовать глубоко-равное () функция с совместимым механизмом XPath 2.0.

3
ответ дан 1 December 2019 в 23:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: