代码之家  ›  专栏  ›  技术社区  ›  Alex Angas Colin

为什么复制XML节点时会丢失命名空间引用?

  •  1
  • Alex Angas Colin  · 技术社区  · 14 年前

    <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. 内存中的节点
    2. 将其作为子级附加到 付款 节点

    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 回复  |  直到 14 年前
        1
  •  2
  •   Edwin de Koning Umair Baig    14 年前

    您需要显式地将前缀添加到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");