явные и неявные пространства имен XML - PullRequest
0 голосов
/ 20 августа 2009

У меня вопрос, как установить значения для двух атрибутов, которые имеют одинаковые имена, но разные пространства имен.

Используя C #, в документе XML мне нужно назначить два атрибута элементу. Это должно выглядеть как

doc xmlns: xmi = "uriaddress" элемент xsi: type = "xsitype1" type = "type1"

Я пытался

xElement.SetAttribute ( "тип", "uriaddress", "xsitype1")

это отлично работает!

однако, меня удивляет то, что когда я пытался установить второй атрибут, "type", с помощью

xElement.SetAttribute ("тип", "тип1")

это работает, но также сбрасывает атрибут xmi: type на то же значение, что и атрибут "тип", изменяя элемент непреднамеренным образом.

Теперь элемент выглядит как

элемент xsi: type = "type1" type = "type1"

Есть ли способ обойти это?

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

Этот код:

    XDocument d = new XDocument();
    XNamespace xsi = "uriaddress";
    d.Add(
        new XElement(
            "element",
            new XAttribute(XNamespace.Xmlns + "xsi", "uriaddress"),
            new XAttribute("type", "foo"),
            new XAttribute(xsi + "type", "bar")));
    using (XmlWriter xw = XmlWriter.Create(Console.Out))
    {
        d.WriteTo(xw);
    }

    d.Element("element").SetAttributeValue("type", "baz");
    using (XmlWriter xw = XmlWriter.Create(Console.Out))
    {
        d.WriteTo(xw);
    }

    d.Element("element").SetAttributeValue(xsi + "type", "bar");        
    using (XmlWriter xw = XmlWriter.Create(Console.Out))
    {
        d.WriteTo(xw);
    }

создает этот вывод (добавлены пробелы и удалены объявления XML для удобства чтения):

<element xmlns:xsi="uriaddress" type="foo" xsi:type="bar" />

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bar" />

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bat" />

Если вы не используете XDocument (трудно сказать по оригинальному сообщению), этот код дает практически тот же результат:

    XmlDocument d = new XmlDocument();
    d.LoadXml("<element xmlns:xsi='uriaddress' type='foo' xsi:type='bar'/>");
    Console.WriteLine(d.OuterXml);

    d.DocumentElement.SetAttribute("type", "baz");
    Console.WriteLine(d.OuterXml);

    d.DocumentElement.SetAttribute("type", "uriaddress", "bat");
    Console.WriteLine(d.OuterXml);
0 голосов
/ 20 августа 2009

Мне кажется, что вы неправильно указали пространство имен в первом вызове SetAttribute. Это пространство имен должно быть пространством имен для префикса xsi, а не для префикса xmi ...

Возможно, вы просто пытаетесь продемонстрировать проблему, поэтому я мог ошибиться здесь.

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...