Search code examples
c#xmllinq-to-xmlxml-namespaces

C# Linq to XML - Keeping namespaces in parent nodes while removing them from child nodes


So I have this XML tree created through LINQ to XML, like this:

   XNamespace xNamespace = "urn:OECD:StandardAuditFile-Tax:PT_";
   XElement main =
    new XElement(xNamespace + "AuditFile",
    new XAttribute("xmlns", "urn:OECD:StandardAuditFile-Tax:PT_"),
    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
    new XElement(xNamespace + "Header",
          new XAttribute("xmlns", "urn:OECD:StandardAuditFile-Tax:PT_"),
          new XElement("AuditFileVersion", "filler"),
          new XElement("CompanyID", "filler"),
          new XElement("TaxRegistrationNumber", "filler"),
          new XElement("TaxAccountingBasis", "filler"),
          new XElement("CompanyName", "filler"),
          new XElement("BusinessName", "filler"),
          new XElement("CompanyAddress",
             new XElement("AddressDetail", "filler"),
             new XElement("City", "filler"),
             new XElement("PostalCode", "filler"),
             new XElement("Region", "filler"),
             new XElement("Country", "filler")
         ),
         new XElement("FiscalYear", "filler"),
         new XElement("StartDate", "filler"),
         new XElement("EndDate", "filler"),
         new XElement("CurrencyCode", "filler"),
         new XElement("DateCreated", "filler"),
         new XElement("TaxEntity", "filler"),
         new XElement("ProductCompanyTaxID", "filler"),
         new XElement("SoftwareCertificateNumber", "filler"),
         new XElement("ProductID", "filler"),
         new XElement("ProductVersion", "filler"),
         new XElement("Telephone", "filler"),
         new XElement("Fax", "filler"),
         new XElement("Email", "filler")
     ));

The contents are just filler since they originally display sensitive information that doesn't really matter for this topic. As you can see, I added the namespaces to the root node AuditFile and to node Header. The xml files comes out like this:

<AuditFile xmlns="urn:OECD:StandardAuditFile-Tax:PT_1_04_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Header xmlns="urn:OECD:StandardAuditFile-Tax:PT_1_04_01">
     <AuditFileVersion xmlns="">filler</AuditFileVersion>
     <CompanyID xmlns="">filler</CompanyID>
     <TaxRegistrationNumber xmlns="">filler</TaxRegistrationNumber>
     <TaxAccountingBasis xmlns="">filler</TaxAccountingBasis>
     <CompanyName xmlns="">filler</CompanyName>
     <BusinessName xmlns="">filler</BusinessName>
     <CompanyAddress xmlns="">
         <AddressDetail>filler</AddressDetail>
         <City>filler</City>
         <PostalCode>filler</PostalCode>
         <Region>filler</Region>
        <Country>filler</Country>
     </CompanyAddress>
     <FiscalYear xmlns="">filler</FiscalYear>
     <StartDate xmlns="">filler</StartDate>
     <EndDate xmlns="">filler</EndDate>
     <CurrencyCode xmlns="">filler</CurrencyCode>
     <DateCreated xmlns="">filler</DateCreated>
     <TaxEntity xmlns="">filler</TaxEntity>
     <ProductCompanyTaxID xmlns="">filler</ProductCompanyTaxID>
     <SoftwareCertificateNumber xmlns="">filler</SoftwareCertificateNumber>
     <ProductID xmlns="">filler</ProductID>
     <ProductVersion xmlns="">filler</ProductVersion>
     <Telephone xmlns="">filler</Telephone>
     <Fax xmlns="">filler</Fax>
     <Email xmlns="">filler</Email>
  </Header>
</AuditFile>

All the other nodes also have the xmlns label, I wanted to remove that while also keeping the namespaces for the AuditFile and Header nodes, is that possible?


Solution

  • Basically it sounds like you want all the elements to be in the same namespace - which is inherited from parents via xmlns. So you need to specify the namespace for all the elements, e.g.

    XNamespace xNamespace = "urn:OECD:StandardAuditFile-Tax:PT_";
    XElement main =
        new XElement(xNamespace + "AuditFile",
        new XAttribute("xmlns", "urn:OECD:StandardAuditFile-Tax:PT_"),
        new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
        new XElement(xNamespace + "Header",
              new XAttribute("xmlns", "urn:OECD:StandardAuditFile-Tax:PT_"),
              new XElement(xNamespace + "AuditFileVersion", "filler"),
              new XElement(xNamespace + "CompanyID", "filler"),
              new XElement(xNamespace + "TaxRegistrationNumber", "filler"),
              new XElement(xNamespace +"TaxAccountingBasis", "filler"),
              new XElement(xNamespace +"CompanyName", "filler"),
              ...
    

    That way, you won't end up with xmlns="" in AuditFileVersion etc, because it'll be in the "right" namespace based on the parent element.