Удалить атрибут Xml узла c# - PullRequest
0 голосов
/ 04 августа 2020

У меня есть файл XML вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ua="http://opcfoundation.org/UA/2008/02/Types.xsd" xmlns="http://opcfoundation.org/UA/SDK/Configuration.xsd">
  <ServerConfiguration>
    <SecurityPolicies>
      <ServerSecurityPolicy>
        <SecurityMode>None_1</SecurityMode>
      </ServerSecurityPolicy>
    </SecurityPolicies>
  </ServerConfiguration>
</ApplicationConfiguration>

Я хочу добавить еще узел с именем ServerSecurityPolicy по коду. Затем я использую этот код:

            string docaddress = "D:\\abc.xml";
            XDocument doc = XDocument.Load(docaddress);
            var root = doc.Root;
            var these = root.Descendants().Where(p => p.Name.LocalName == "SecurityPolicies");
            XElement addelement = new XElement("ServerSecurityPolicy");
            addelement.Add(new XElement("SecurityMode", "None_1"));           
            foreach (var elem in these)
            {
                elem.Add(addelement);
            }
            doc.Save(docaddress);

Он действительно работает, но недавно добавленный узел выглядит примерно так:

      <ServerSecurityPolicy xmlns="">
        <SecurityMode>None_1</SecurityMode>
      </ServerSecurityPolicy>

Мне не нужен атрибут «xmlns», тогда Я пытаюсь удалить его примерно так:

            var these2 = root.Descendants().Where(p => p.Name.LocalName == "ServerSecurityPolicy");
            foreach (var elem in these2)
            {
                    label2.Text += elem.Attribute("xmlns").Name.LocalName;
                    elem.Attribute("xmlns").Remove();
            }

label2.Text показывает «xmlnsxmlnsxmlsn ...», так что я думаю, что elem.Attribute («xmlns») указал на нужные мне атрибуты. удалить, но Remove () не работает. Можете ли вы предложить мне несколько способов удалить атрибут или добавить узел без атрибута? Спасибо

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Проблема в том, что элемент, который вы хотите создать, на самом деле находится в пространстве имен http://opcfoundation.org/UA/SDK/Configuration.xsd, которое является значением по умолчанию для документа из-за этой части элемента root:

xmlns="http://opcfoundation.org/UA/SDK/Configuration.xsd"

You можно легко создать элемент в этом пространстве имен:

XNamespace configNs = "http://opcfoundation.org/UA/SDK/Configuration.xsd";
var these = root.Descendants(configNs + "ServerSecurityPolicy");

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

Я бы также предложил использовать пространство имен для поиска элементов:

XNamespace configNs = "http://opcfoundation.org/UA/SDK/Configuration.xsd";
var these = root.Descendants(configNs + "SecurityPolicies");

Это намного чище, чем просто использование локального имени, в моем просмотр.

1 голос
/ 04 августа 2020

Причина, по которой вы получаете пустой атрибут, на который ссылается xmlns="", заключается в том, что узел root вашего документа принадлежит пространству имен xsi. Когда вы добавляете узел без пространства имен - как вы это делаете в своем примере - вы фактически не привязываете его к пространству имен xsi.

Чтобы сделать ваш узел частью root пространство имен, замените

new XElement("ServerSecurityPolicy")

на

new XElement("ServerSecurityPolicy",
              new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"))
...