Разве XElement не должен наследовать пространство имен от своего родительского Xelement? - PullRequest
0 голосов
/ 11 февраля 2011

Я впервые использую Linq для XML в .NET 3.5, и у меня возникли некоторые проблемы с пространствами имен.А именно, XElement печатается так: <opf:metadata>, когда я просто хочу сказать: <metadata>.

Вот код:

    XNamespace opfNamespace = "http://www.idpf.org/2007/opf";
        XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
        XNamespace dcterms = "http://purl.org/dc/terms/";
        XNamespace dc = "http://purl.org/dc/elements/1.1/";

        opfRoot = new XElement(opfNamespace + "package",
                                    new XAttribute("version", "2.0"),
                                    new XAttribute("unique-identifier", "uuid_id"));
        XElement metadata = new XElement(opfNamespace + "metadata",
                                    new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                                    new XAttribute(XNamespace.Xmlns + "opf", opfNamespace),
                                    new XAttribute(XNamespace.Xmlns + "dcterms", dcterms),
                                    new XAttribute(XNamespace.Xmlns + "dc", dc),
                                    new XElement(dc + "language", "pt-BR"));
        opfRoot.Add(metadata);

И вот результат:

<?xml version="1.0" encoding="utf-8"?>
<package version="2.0" unique-identifier="uuid_id" xmlns="http://www.idpf.org/2007/opf">
  <opf:metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <dc:language>pt-BR</dc:language>
  </opf:metadata>
</package>

Я ожидал, что элемент метаданных будет поставлен без opf: "opf: metadata"

Если я удалю opfNameSpace из {opfNameSpace + "metadata"}, я получу пустое xmlnsnamespace (xmlns = "") в элементе метаданных.

Я смотрел на эту тему:

Как мне написать xml с пространством имен и префиксом с XElement?

и этот:

Пространство имен XElement по умолчанию для атрибутов обеспечивает неожиданное поведение

Но они не решили мою проблему.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 11 февраля 2011

Это потому, что вы переделываете псевдоним пространства имен opf в элемент метаданных. Просто удалите этот атрибут:

new XAttribute(XNamespace.Xmlns + "opf", opfNamespace)

из вызова конструктора <metadata>, и он отлично работает:

<package version="2.0" unique-identifier="uuid_id"
         xmlns="http://www.idpf.org/2007/opf">
  <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcterms=
"http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <dc:language>pt-BR</dc:language>
  </metadata>
</package>

Теперь вы можете утверждать, что поскольку вы переделываете псевдоним пространства имен так, чтобы он имел тот же URL, что и раньше, это не имеет значения - честно говоря, я не знаю, что спецификация говорит об этом. Но это кажется несколько разумным.

С другой стороны, я считаю, что две XML-формы должны в конечном итоге обрабатываться одинаково при их разборе, поэтому, если удобнее создать элемент metadata со всеми соответствующими объявлениями, то он не должен вызывать какой-либо проблемы ... AFAIK:)

1 голос
/ 11 февраля 2011

Удалить new XAttribute(XNamespace.Xmlns + "opf", opfNamespace),.

0 голосов
/ 14 февраля 2011

Поскольку нужное мне форматирование пространства имен было очень конкретным, и оно не генерировалось правильно даже при решении проблемы метаданных opf: я нашел лучший способ.Я просто создал XmlDocument вручную и добавил XML.Оттуда я могу редактировать это программно.Вот так:

            XmlDocumentopf = new XmlDocument();
            opf.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
                            "<package version=\"2.0\" unique-identifier=\"uuid_id\" xmlns=\"http://www.idpf.org/2007/opf\">" +
                            "<metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dcterms=\"http://purl.org/dc/terms/\">" +
                            "<dc:title>Title of this book</dc:title>" +
                            "<dc:language>pt-BR</dc:language>" +
                            "<dc:identifier id=\"uuid_id\" opf:scheme=\"uuid\">a335de4c-560f-4b75-bcba-1418b726f92c</dc:identifier>" +
                            "<dc:creator opf:role=\"aut\">Desconhecido(a)</dc:creator>" +
                            "<dc:date>2011-01-31T11:59:46.949000+00:00</dc:date>" +
                            "<meta name=\"cover\" content=\"book-cover\"/>" +
                            "</metadata>" +
                            "<manifest />" +
                            "<spine toc=\"ncx\" />" +
                            "<guide />" +
                            "</package>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...