C# Linq to XML – сохранение пространств имен в родительских узлах при удалении их из дочерних узлов

Итак, у меня есть XML-дерево, созданное с помощью LINQ to XML, например:

   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")
     ));

Содержимое является лишь заполнителем, поскольку изначально оно отображает конфиденциальную информацию, которая не имеет особого значения для этой темы. Как видите, я добавил пространства имен в корневой узел AuditFile и в узел Header. XML-файлы выглядят следующим образом:

<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>

Все остальные узлы также имеют метку xmlns. Я хотел удалить ее, сохранив при этом пространства имен для узлов AuditFile и Header, возможно ли это?

XML пространство имен автоматически наследуется от родителя. В вашем случае пространство имен по умолчанию меняется с xmlns = "urn:OECD:StandardAuditFile-Tax:PT_1_04_01" на пустое пространство имен. Таким образом, корневое пространство имен по умолчанию имеет проверку ошибок, в то время как дочерний узел не имеет никакой проверки ошибок. Вы можете получить ложные ошибки, если удалите пустое пространство имен в дочернем элементе.

jdweng 15.07.2024 17:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, это звучит так, будто вы хотите, чтобы все элементы находились в одном пространстве имен, которое наследуется от родителей через xmlns. Поэтому вам нужно указать пространство имен для всех элементов, например.

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"),
          ...

Таким образом, вы не получите xmlns = "" в AuditFileVersion и т. д., потому что он будет в «правильном» пространстве имен на основе родительского элемента.

Это работает, большое спасибо

MuchoG 15.07.2024 17:45

Другие вопросы по теме