Элегантное решение для разбора XElements в пространстве имен - PullRequest
1 голос
/ 16 августа 2010

В проекте, над которым я работаю, я только что закончил писать XSD для своего XML, чтобы другие инженеры могли легче работать с XML. Наряду с этим XSD пришли пространства имен XML. В моем текущем коде синтаксического анализа я использовал что-то вроде этого:

XElement element = xmlRoot.Element(XML.ELEMENT_NAME);

С XML, являющимся классом, полным констант, который используется в программе для ввода и вывода XML. Но теперь, когда используются пространства имен, это больше не работает. Очевидное, но едва элегантное решение состоит в том, чтобы сделать так, чтобы весь код синтаксического анализа выглядел так:

XElement element = xmlRoot.Element(XML.NAMESPACE + XML.ELEMENT_NAME);

Думая об этом больше, было бы гораздо лучше уйти и определить метод расширения, который нужно добавить в это пространство имен и вернуть XElement. Эта идея заставит код выглядеть примерно так:

XElement element = xmlRoot.GetMyElement(XML.ELEMENT_NAME);

Эти идеи - то, что я до сих пор придумывал, чтобы иметь дело с проблемой пространства имен. По сути, мой вопрос здесь такой:
Есть ли лучший способ синтаксического анализа элементов XE с известным постоянным пространством имен? Если так, что это?

1 Ответ

2 голосов
/ 19 августа 2010

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

Я пошел дальше и использовал метод расширения, который автоматически добавлялся в пространство имен.Обратите внимание, что это работает, только если у вас есть постоянное пространство имен!В противном случае вы можете захотеть добавить еще один аргумент в ваш метод расширения, просто чтобы избежать странной конкатенации пространства имен.

      public static XElement
      GetNamespaceElement(this XElement element, string ns, string name)
      {
          XNamespace n = new XNamespace();
          n.NamespaceName = ns;
          return element.Element(n + name);
      }
...