Почему ссылка на пространство имен теряется при копировании узлов XML? - PullRequest
1 голос
/ 28 сентября 2010

У меня есть XML-документ (форма InfoPath), который выглядит примерно так:

<my:ClientMaintenance xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-07-06T07:04:54">
    <my:Payments>
    </my:Payments>
    <my:Payment>
        <my:Amount></my:Amount>
        <!-- Several other nodes -->
    </my:Payment>
</my:ClientMaintenance>

Узел Payment используется в качестве шаблона для добавления новых платежей в узел Payments.Поэтому, когда в форме нажимается кнопка Добавить платеж , мне необходимо:

  1. Взять копию узла Payment в памяти
  2. Обновитьзначения
  3. Добавить его как дочерний узел Payments

По какой-то причине в конце этого я больше не могу запрашивать какие-либо узлы в пространстве имен my!Вот код:

public void btnAddPaymentClicked(object sender, ClickedEventArgs e)
{
    var navigator = e.Source.CreateNavigator();
    var blankPayment = GetBlankPaymentNode(navigator).CreateNavigator();
    // new XmlNamespaceManager(blankPayment.NameTable).HasNamespace("my") == false
    // WHY???
}

private XmlDocument GetBlankPaymentNode(XPathNavigator navigator)
{
    var blankPayment = navigator.SelectSingleNode(FullBlankPaymentXPath, NamespaceManager);
    var blankXml = new XmlDocument();
    blankXml.LoadXml(blankPayment.OuterXml);
    var schema = new XmlSchema();
    schema.Namespaces.Add("my", MyNamespaceUri);  // Set elsewhere and != null
    blankXml.Schemas.Add(schema);
    return blankXml;
}

Почему на пространство имен больше нельзя ссылаться?

1 Ответ

2 голосов
/ 28 сентября 2010

Вам необходимо явно добавить префикс в XmlNamespaceManager:

XPathNavigator blankPayment = GetBlankPaymentNode(navigator).CreateNavigator();
XmlNamespaceManager nsmngr = new XmlNamespaceManager(blankPayment.NameTable); 
nsmngr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003" + 
     "/myXSD/2009-07-06T07:04:54");

Теперь вы можете ссылаться на пространство имен по префиксу.

...