Я думаю, ваш ответ на ваш вопрос: «Что я действительно хочу сделать, так это канонизировать один узел, но, как вы можете видеть в выходном файле, вывод не содержит никакого внутреннего xml».
Если я вас понимаю, то на самом деле вы не хотите канонизировать отдельный узел, или вы были бы рады, если бы он не содержал внутренний XML. Вы хотите канонизировать одно поддерево .
XPath возвращает узлы, а не поддеревья. Некоторые операции над узлами, возвращаемыми выражением XPath, будут по умолчанию включать их дочерние и атрибутивные узлы, но преднамеренно канонизация не является одной из них, поскольку потенциально некоторые из этих самых дочерних узлов могут быть изменяемыми способами, которые вы не подписываете. При подписании вы подписываете только те узлы, которые, как вы говорите, подписываете.
Изменение строки в вашем коде с:
XmlNodeList nodeList = xDoc.SelectNodes("//Child1");
до:
XmlNodeList nodeList =
xDoc.SelectNodes("//Child1/descendant-or-self::node()|//Child1//@*");
Значит, я получаю следующее в child1.xml:
<Child1 xmlns:test="http://www.test.com/xades#" Attribute1="c1" Bttribute="c2" Cttribute="c3">
<child11 Attribute11="c11">Element11</child11>
</Child1>
Правильно ли я считаю, что это то, что вы хотите?
Между прочим, больше точности по направлениям:
XmlNodeList nodeList =
xDoc.SelectNodes("//Child1[1]/descendant-or-self::node()|//Child1[1]//@*");
Может быть полезно, так как тогда оценка xpath может прекратиться, когда дойдет до первого </Child1>
, с выигрышем в производительности, который может быть значительным, если ваши реальные данные велики.