Обход сложного XML-документа в C # с помощью XLinq - PullRequest
1 голос
/ 29 июня 2010

Итак, я хочу получить доступ к дочернему элементу в структуре, которая выглядит следующим образом:

<asdf:foobar attr="value">
    <child>...</child>
</asdf:foobar>

Я забыл, как называется asdf, но именно это вызывает проблему.Мой обычный метод обхода в XLinq не работает:

xElem child = xDoc.Element("foobar");

Устанавливает child в null, потому что он утверждает, что нет элемента foobar и

xElem child = xDoc.Element("asdf:foobar");

Не работает, потому что компилятор жалуется на точку с запятой.

Вся помощь приветствуется, и спасибо заранее!

ОБНОВЛЕНИЕ:

Я работал над воспроизведением этого в качестве примера (так как я не могу показать вам реальный код).Мой тестовый код:

        Console.WriteLine("BEGIN TEST");

        const string MY_SCHEMA = "http://www.example.com/whatever";

        XElement xTest =
        new XElement("{" + MY_SCHEMA + "}base",
            new XAttribute("{" + XML_STANDARD + "}boofar", MY_SCHEMA),
            new XAttribute("attr1", "val"),
            new XElement("{" + MY_SCHEMA + "}asdf", "ghjkl")
        );

        result.Text = xTest.ToString();

        XElement xOps2 = xTest.Element(XName.Get("asdf", MY_SCHEMA));
        XElement xSubOps2;

        if (xOps2 == null)
        {
            MessageBox.Show("Failure.");
        }
        else
        {
            xSubOps2 = xOps2.Element(XName.Get("asdf", MY_SCHEMA));
            MessageBox.Show(xSubOps2.ToString());
        }

        Console.WriteLine("END TEST");

        MessageBox.Show("END TEST");

Здесь отображается нужный мне XML:

<boofar:base xmlns:boofar="http://www.example.com/whatever" attr1="val">
  <boofar:asdf>ghjkl</boofar:asdf>
</boofar:base>

И все работает отлично.Спасибо всем!

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

К сожалению, неявное преобразование из string в XName не анализирует пространство имен. Вам нужно сделать это:

XName.Get("foobar", "asdf");
1 голос
/ 29 июня 2010

Еще один способ обработки пространств имен - использование класса XNamespace.

  XNamespace ns = "http://www.example.com/whatever";
  XElement child = new XElement(ns + "base");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...