Создание XmlNode/XmlElement в C# без XmlDocument?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

47
задан Peter Mortensen 15 May 2010 в 22:21
поделиться

6 ответов

Можно хотеть посмотреть на то, как можно использовать встроенные функции.NET, чтобы сериализировать и десериализовать объект в XML, вместо того, чтобы создать ToXML() метод на каждом классе, который является по существу просто Объектом Передачи данных.

я использовал эти методы успешно на нескольких проектах, но don’t имеют детали реализации, удобные прямо сейчас. Я попытаюсь обновить свой ответ с моими собственными примерами когда-то позже.

Вот несколько примеров что возвращенный Google:

Сериализация XML в.NET Venkat Subramaniam http://www.agiledeveloper.com/articles/XMLSerialization.pdf

, Как Сериализировать и Десериализовать объект в XML http://www.dotnetfunda.com/articles/article98.aspx

, Настраивает Вашу сериализацию XML объекта.NET с атрибутами XML.NET http://blogs.microsoft.co.il/blogs/rotemb/archive/2008/07/27/customize-your-net-object-xml-serialization-with-net-xml-attributes.aspx

15
ответ дан Sir Crispalot 26 November 2019 в 19:33
поделиться

Я рекомендовал бы использовать XDoc и XElement Системы. Xml. Linq вместо материала XmlDocument. Это было бы лучше, и Вы будете в состоянии использовать питание LINQ в запросах и парсинге Вашего XML:

Используя XElement, Ваш ToXml () метод будет похож на следующее:

public XElement ToXml()
{
    XElement element = new XElement("Song",
                        new XElement("Artist", "bla"),
                        new XElement("Title", "Foo"));

    return element;
}
43
ответ дан mohammedn 26 November 2019 в 19:33
поделиться

От объектной модели документа W3C спецификация Уровня 1 (Ядра) (полужирный является моим):

большинство API, определенных этой спецификацией, является интерфейсами, а не классами. Это означает, что фактическая реализация должна только представить методы с определенными именами и определенной операцией, не на самом деле реализуют классы, которые соответствуют непосредственно интерфейсам. Это позволяет API DOM быть реализованными как тонкая фанера сверху унаследованных приложений с их собственными структурами данных, или сверху более новых приложений с различными иерархиями классов. Это также означает, что обычные конструкторы (в Java или смысле C++) не могут использоваться для создания Объектов DOM, так как основные объекты, которые будут созданы, могут иметь мало отношений к интерфейсам DOM . Стандартное решение этого в объектно-ориентированном дизайне состоит в том, чтобы определить методы фабрики, которые создают объекты-экземпляры, которые реализуют различные интерфейсы. На Уровне 1 DOM объекты, реализовывая некоторый интерфейс "X" создаются "createX ()" метод в интерфейсе Document; это вызвано тем, что все Объекты DOM живут в контексте определенного Документа .

AFAIK, Вы не можете создать никакой XmlNode (XmlElement, XmlAttribute, XmlCDataSection, и т.д.) кроме XmlDocument от конструктора.

, Кроме того, обратите внимание, что Вы не можете использовать XmlDocument.AppendChild() для узлов, которые не создаются через методы фабрики тот же документ. В случае, если у Вас есть узел из другого документа, необходимо использовать XmlDocument.ImportNode().

17
ответ дан Panos 26 November 2019 в 19:33
поделиться

Вам нужен Linq - Система. Xml. Linq, чтобы быть точным.

можно создать XML, использующий XElement с нуля - который должен в значительной степени уладить Вас.

2
ответ дан Murph 26 November 2019 в 19:33
поделиться

Вы не можете возвратиться XmlElement или XmlNode, потому что те объекты всегда и только существуют в контексте владения XmlDocument.

сериализация XML немного легче, чем возврат XElement, потому что все, что необходимо сделать, отметить свойства с атрибутами, и сериализатор делает все поколение XML для Вас. (Плюс Вы получают десериализацию бесплатно, предполагая, что у Вас есть конструктор без параметров и, ну, в общем, набор других вещей.)

, С другой стороны, a) необходимо создать XmlSerializer, чтобы сделать это, b) контакт со свойствами набора не является вполне легкой задачей, которой Вам могло бы понравиться, когда он был и c) Сериализация XML является довольно немой; Вы являетесь неудачливыми, если Вы хотите сделать что-нибудь воображение с XML, Вы генерируете.

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

1
ответ дан Robert Rossney 26 November 2019 в 19:33
поделиться

Вы можете вернуть XMLDocument для метода TOXML в вашем классе, затем, когда вы собираетесь добавить элемент с результатом документа, просто используйте Что-то вроде:

XmlDocument returnedDocument = Your_Class.ToXML();

XmlDocument finalDocument = new XmlDocument();
XmlElement createdElement = finalDocument.CreateElement("Desired_Element_Name");
createdElement.InnerXML = docResult.InnerXML;
finalDocument.AppendChild(createdElement);

Таким образом, вся ценность для «lede_Element_name» на вашем результате XMLDocument будет весь содержимое возвращенного документа.

Я надеюсь, что это поможет.

4
ответ дан 26 November 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: