Есть XML (покажу интересующую его часть):
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>
Создаю XmlNamespaceManager и через XPathNavigator пробегаюсь по узлам и собираю XmlNamespaceScope.ExcludeXml. Но вот в чем проблема... нет префикса для добавления в XmlNamespaceManager. Либо префикс определяется как "xml", а на самом деле если указывать его у узла, то он будет "ds". В итоге потом не работает поиск по XPath.
Как можно определить из такого XML правильные префиксы для узлов и URI для них, чтобы заполнить XmlNamespaceManager ?
В приведённом куске xml используются пространства имён по умолчанию (default namespace). Это значит, что у них нет префиксов.
Запись без префиксов, что неудивительно, уменьшает размер xml. Но их придётся использовать, если в одном узле используются более одного пространства имён.
Чтобы в коде получить нужные данные с помощью XPath мы, тем не менее, должны задавать префиксы.
var document = new XPathDocument("test.xml");
var navigator = document.CreateNavigator();
var manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("a", "http://www.w3.org/2001/04/xmlenc#");
manager.AddNamespace("b", "http://www.w3.org/2000/09/xmldsig#");
var node = navigator.SelectSingleNode(
"a:EncryptedData/b:KeyInfo/a:EncryptedKey/b:KeyInfo/b:X509Data/b:X509Certificate",
manager);
В данном примере мы получаем самый последний из показанных в вопросе узлов, последовательно указывая цепочку элементов.
EncryptedData
и EncryptedKey
имеют одинаковое пространство имён. Добавляем его в менеджер, задавая префикс a
(можно использовать любой, скажем, foo
или enc
).
Элементы KeyInfo
расположены в другом пространстве имён. Тоже добавляем его в менеджер, задавая префикс b
.
Теперь самое интересное. Элементы X509Data
и X509Certificate
, на первый взгляд, не имеют неймспейсов. Однако, они вложены в элемент с пространством имён по умолчанию (без префикса) и, так как они сами не имеют префикса, значит сами относятся к этому же пространству имён. Следовательно в XPath мы тоже должны указать для них тот же префикс b
, привязанный к нужному неймспейсу.
Дополню.
Эти элементы:
<node xmlns="example.org"/>
<foo:node xmlns:foo="example.org"/>
согласно спецификации xml одинаковы. Потому что имеют одинаковые имена и определены в одном и том же пространстве имён. Префикс не имеет никакой роли.
Есть несколько реализаций MD5, к примеруУзнать, какой метод из них выполняется быстрее - не проблема
В начале пытался записать через for( int i = 1; i==256; i*2){} Но что-то пошло не так и я не смог понять,как делить до определенного делителя, не используя...
Нужна временная папка для хранения и обработки файловПрочитал на msdn, что можно воспользоваться Path