Лучший .net метод для создания документа XML

Когда вы сначала используете код EF 6.x

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

и инициализируете таблицу базы данных, он будет помещать

(newsequentialid())

в свойства таблицы под заголовком. По умолчанию Значение или Связывание, позволяющее заполнять идентификатор, когда он вставлен.

Проблема заключается в том, что вы создаете таблицу и добавляете часть

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

позже, будущие базы данных обновлений не будет добавлять обратно (newsequentialid ())

. Чтобы исправить правильный путь, нужно стереть миграцию, удалить базу данных и перенаправить ... или вы можете просто добавить (newsequentialid ()) в таблицу дизайнер.

16
задан Jonathan Wood 28 December 2017 в 18:41
поделиться

9 ответов

Несколько лет назад я обнаружил, что происходит, если я сделал свои функции короткими :

  • я мог понять их. Мой мозг маленький, и длинные функции не подходят.

  • Классы усложняются (множество функций). Но Extract Class производил небольшие, сплоченные, одноцелевые классы. Опять же, небольшой мозг, поэтому небольшие классы требовали.

  • Число переменных в функции (или классе) невелико. Запоминание, которое от времени объявления до времени использования легко, потому что расстояние является коротким .

  • Число областей в моих функциях невелико, поэтому мне не нужно выяснять, куда идут переменные.

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

Поскольку количество переменных в области невелико и цель очевидна, мне редко нужно прилагать какие-либо усилия для выбора описательного имени. Поскольку я не хочу напрягать свой маленький мозг больше, чем должен, я никогда не сокращаю . Имя переменной по умолчанию - это имя типа. Например, класс Foo входит в переменную foo . В моем коде, если это когда-то что-то другое, вы знаете, что происходит что-то особенное, и вы должны обратить внимание.

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

-121--2422241-

Посмотрите на спецификацию brk/sbrk .

Вызов, в основном, просит ОС выделить больше памяти для приложения, увеличив предыдущее «значение разрыва» на определенную величину. Этот объем (первый параметр) - это объем дополнительной памяти, который затем получает приложение.

Большинство элементарных реализаций malloc основаны на вызове системы sbrk для получения блоков памяти, которые они разделяют и трек. Функция mmap обычно считается лучшим выбором (именно поэтому mallocs вроде dlmalloc поддерживают оба с # ifdef).

Что касается «как это работает», то sbrk на самом простом уровне может выглядеть примерно так:

uintptr_t current_break; // Some global variable for your application.
                         // This would probably be properly tracked by the OS for the process
void *sbrk(intptr_t incr)
{
    uintptr_t old_break = current_break;
    current_break += incr;
    return (void*) old_break;
}

Современные операционные системы сделают гораздо больше, например, сопоставят страницы в адресном пространстве и добавят информацию отслеживания для каждого выделенного блока памяти.

-121--3894524-

Ответ Джоша показывает, как легко создать один элемент в LINQ к XML... это не показывает, как также очень легко создать несколько элементов. Предположим, что имеется Список < Порядок > , называемый порядками ... можно создать весь документ так:

var xml = new XElement("Orders",
    orders.Select(order =>
        new XElement("Order",
            new XAttribute("OrderNumber", order.OrderNumber),
            new XElement("ItemNumber", order.ItemNumber),
            new XElement("QTY", order.Quantity),
            new XElement("Warehouse", order.Warehouse)
        ));
);

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

XNamespace ns = "http://your/namespace/here";
var xml = new XElement(ns + "Orders",
    orders.Select(order =>
        new XElement(ns + "Order",
... (rest of code as before)

LINQ в XML является лучшим API XML, с которым я работал... Это отлично для запроса тоже.

29
ответ дан 30 November 2019 в 11:08
поделиться

Вы просто щелкните правой кнопкой мыши на вашем окне кода, выберите INSERTSNIPPET Следуйте по этой ссылке

 Data-Xml.....>Xml>Xmlcreate

Это очень легко

-2
ответ дан 30 November 2019 в 11:08
поделиться

На x86 чтения и записи в любом случае атомарны. Поддерживается на аппаратном уровне. Однако это не означает, что операции, такие как сложение и умножение, являются атомарными; они требуют нагрузки, вычисления, затем хранения, что означает, что они могут вмешиваться. Здесь и появляется префикс блокировки.

Вы упомянули барьеры блокировки и памяти; они не имеют никакого отношения к тому, что чтение и запись являются атомарными. Нет пути для x86 с или без использования барьеров памяти, что вы собираетесь увидеть наполовину записанное 32-битное значение.

-121--3260512-

Причина, по которой эти типы имеют гарантированную атомность, заключается в том, что они все имеют размер 32 бита или меньше. Поскольку .NET работает только на 32 и 64-разрядных операционных системах, архитектура процессора может считывать и записывать все значение за одну операцию. Это, напротив, Int64 на 32-разрядной платформе, которая должна быть считана и записана с использованием двух 32-разрядных операций.

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

-121--3260510-

Мне пришлось создать следующий XML-документ, часть которого была параметризована.

<?xml version="1.0" encoding="utf-8"?>
<wap-provisioningdoc>
  <characteristic type="BOOTSTRAP">
    <parm name="NAME" value="SYNCSETTINGS" />
  </characteristic>
  <characteristic type="APPLICATION">
    <parm name="APPID" value="w5" />
    <parm name="TO-NAPID" value="INTERNET" />
    <parm name="NAME" value="SYNCSETTINGS" />
    <parm name="ADDR" value="http://syncserver/sync" />
    <characteristic type="RESOURCE">
      <parm name="URI" value="pb" />
      <parm name="NAME" value="Contacts DB" />
      <parm name="AACCEPT" value="text/x-vcard" />
    </characteristic>
    <characteristic type="RESOURCE">
      <parm name="URI" value="cal" />
      <parm name="NAME" value="Calendar DB" />
      <parm name="AACCEPT" value="text/x-vcalendar" />
    </characteristic>
    <characteristic type="RESOURCE">
      <parm name="URI" value="notes" />
      <parm name="NAME" value="Notes DB" />
      <parm name="AACCEPT" value="text/plain" />
    </characteristic>
    <characteristic type="APPAUTH">
      <parm name="AAUTHNAME" value="username" />
      <parm name="AAUTHSECRET" value="password" />
    </characteristic>
  </characteristic>
</wap-provisioningdoc>

И вот мой код, который делает это с помощью одной инструкции LINQ.

Обратите внимание, что создание XML-документа выше с использованием LINQ и сохранение его в XML-файле сохраняет форматирование XML-документа и сохраняет разрывы строк и возврат каретки, что делает документ правильно табулированным.

public string CreateOTAXmlFile(string Username, string Password)
    {
        var ota = new XDocument(
                    new XElement("wap-provisioningdoc",
                        new XElement("characteristic", new XAttribute("type", "BOOTSTRAP"),
                            new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "SYNCSETTINGS"))
                                    ),
                        new XElement("characteristic", new XAttribute("type", "APPLICATION"),
                            new XElement("parm", new XAttribute("name", "APPID"), new XAttribute("value", "w5")),
                            new XElement("parm", new XAttribute("name", "TO-NAPID"), new XAttribute("value", "INTERNET")),
                            new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "SYNCSETTINGS")),
                            new XElement("parm", new XAttribute("name", "ADDR"), new XAttribute("value", "http://syncserver/sync")),
                            new XElement("characteristic", new XAttribute("type", "RESOURCE"),
                                new XElement("parm", new XAttribute("name", "URI"), new XAttribute("value", "pb")),
                                new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "Contacts DB")),
                                new XElement("parm", new XAttribute("name", "AACCEPT"), new XAttribute("value", "text/x-vcard"))
                                        ),
                            new XElement("characteristic", new XAttribute("type", "RESOURCE"),
                                new XElement("parm", new XAttribute("name", "URI"), new XAttribute("value", "cal")),
                                new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "Calendar DB")),
                                new XElement("parm", new XAttribute("name", "AACCEPT"), new XAttribute("value", "text/x-vcalendar"))
                                        ),
                            new XElement("characteristic", new XAttribute("type", "RESOURCE"),
                                new XElement("parm", new XAttribute("name", "URI"), new XAttribute("value", "notes")),
                                new XElement("parm", new XAttribute("name", "NAME"), new XAttribute("value", "Notes DB")),
                                new XElement("parm", new XAttribute("name", "AACCEPT"), new XAttribute("value", "text/plain"))
                                        ),
                            new XElement("characteristic", new XAttribute("type", "APPAUTH"),
                                new XElement("parm", new XAttribute("name", "AAUTHNAME"), new XAttribute("value", Username)),
                                new XElement("parm", new XAttribute("name", "AAUTHSECRET"), new XAttribute("value", Password))
                                        )
                                    )
                                )
                            );

        ota.Save(Server.MapPath("~/OTA/") + Username + ".xml");
        return (ota.ToString());

    }
0
ответ дан 30 November 2019 в 11:08
поделиться

Как насчет этого: создать класс «Заказ» и один «заказы», ​​а затем сериализуйте их XML - кажется, намного проще, чем создание бита XML от руки. ...

Так как вы говорите, вы вытягиваете данные от своего ERP, вы, вероятно, уже имеете объекты и классы для «заказа» и так далее - может быть, достаточно поставить несколько атрибутов [xmlelement] на ваши классы, и вы Хорошо, чтобы пойти!

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace XmlLinqTest
{
    [Serializable]
    [XmlRoot(Namespace = "")]
    public class Orders
    {
        private List<Order> _orders = new List<Order>();

        /// <remarks/>
        [XmlElement("Order")]
        public List<Order> OrderList
        {
            get { return _orders; }
        }
    }

    /// <remarks/>
    [Serializable]
    public class Order
    {
        /// <remarks/>
        [XmlElement]
        public string ItemNumber { get; set; }

        [XmlElement]
        public int QTY { get; set; }

        /// <remarks/>
        [XmlElement]
        public string WareHouse { get; set; }

        /// <remarks/>
        [XmlAttribute]
        public string OrderNumber { get; set; }
    }
}

И в вашем главном приложении что-то вроде этого:

Orders orders = new Orders();

Order work = new Order() { ItemNumber = "0123993587", OrderNumber = "12345", QTY = 10, WareHouse = "PA019" };
orders.OrderList.Add(work);

work = new Order() { ItemNumber = "0123993587", OrderNumber = "12346", QTY = 9, WareHouse = "PA019" };
orders.OrderList.Add(work);

work = new Order() { ItemNumber = "0123993587", OrderNumber = "12347", QTY = 8, WareHouse = "PA019" };
orders.OrderList.Add(work);

XmlSerializer ser = new XmlSerializer(typeof(Orders));

using(StreamWriter wr = new StreamWriter(@"D:\testoutput.xml", false, Encoding.UTF8))
{
    ser.Serialize(wr, orders);
}

Работает с объектами, а затем сериализация их на диске кажется намного легче для меня, чем возобновить с помощью XDocument и других API.

5
ответ дан 30 November 2019 в 11:08
поделиться

Несколько лет назад я обнаружил, что произойдет, если я сделаю свои функции коротко :

  • Я мог их понять. Мой мозг маленький, а длинные функции не подходят.

  • Классы усложняются (множество функций). Но извлечение класса производится небольшими, сплоченными, однозначными классами. Опять же, маленький мозг, так Небольшие классы требуются.

  • Количество переменных в функции (или классе) мало. Вспоминание, которое из того, что из времени объявления в использовании времени легко, потому что расстояние короткое .

  • Число в моих функциях в моих функциях мало, поэтому мне не нужно выяснить, какие переменные идут где.

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

Поскольку количество переменных в объеме мало, и цель очевидно, я редко нужно прилагать любые усилия, чтобы выбрать описательное имя. Поскольку я не хочу напрягать мой маленький мозг больше, чем я должен, Я никогда не сокращаюсь . Мое имя по умолчанию для переменной - это имя типа. Например. Класс Foo идет в переменной foo . В моем коде, если это когда-либо что-то другое, вы знаете, что-то особенное происходит, и вы должны обратить внимание.

В старые времена моя привычка No-abbbruviation будет производить громоздкий код, но поскольку мои методы и классы невелики, код не страдает.

-121--2422241-

Если ваш корпус использования прост, ничто не может проще и проще в использовании, чем XMLTextWriter. Тем не менее, одна альтернатива будет использовать объект XMLDocument для создания и добавления всех ваших узлов. Но я думаю, что проще написать и поддерживать код, который использует XMLTextWriter, если вы создаете документ с нуля, а не манипулируя одним. Использование XMLTextWriter должен быть очень простым:

        StringBuilder output = new StringBuilder();
        XmlWriter writer = XmlWriter.Create(output);
        writer.WriteProcessingInstruction("xml", "version=\"1.0\"");
        writer.WriteStartElement("Orders");
        //...start loop...
        writer.WriteStartElement("Order");
        writer.WriteAttributeString("OrderNumber", "12345");
        writer.WriteElementString("ItemNumber", "0123993587");
        writer.WriteElementString("QTY", "10");
        writer.WriteElementString("WareHouse", "PA019");
        writer.WriteEndElement();
        //...loop...
        writer.WriteEndElement();
        writer.Close();
2
ответ дан 30 November 2019 в 11:08
поделиться
// Create the xml document containe
XmlDocument doc = new XmlDocument();// Create the XML Declaration, and append it to XML document
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null);
doc.AppendChild(dec);// Create the root element
XmlElement root = doc.CreateElement("Library");
doc.AppendChild(root);
// Create Books
// Note that to set the text inside the element,
// you use .InnerText instead of .Value (which will throw an exception).
// You use SetAttribute to set attribute
XmlElement book = doc.CreateElement("Book");
book.SetAttribute("BookType", "Hardcover");
XmlElement title = doc.CreateElement("Title");
title.InnerText = "Door Number Three";
XmlElement author = doc.CreateElement("Author");
author.InnerText = "O'Leary, Patrick";
book.AppendChild(title);
book.AppendChild(author);
root.AppendChild(book);
book = doc.CreateElement("Book");
book.SetAttribute("BookType", "Paperback");
title = doc.CreateElement("Title");
title.InnerText = "Lord of Light";
author = doc.CreateElement("Author");
author.InnerText = "Zelanzy, Roger";
book.AppendChild(title);
book.AppendChild(author);
root.AppendChild(book);
string xmlOutput = doc.OuterXml;
The same code but using an XMLWriter to a memory stream.

XmlWriterSettings wSettings = new XmlWriterSettings();
wSettings.Indent = true;
MemoryStream ms = new MemoryStream();
XmlWriter xw = XmlWriter.Create(ms, wSettings);// Write Declaration
xw.WriteStartDocument();
// Write the root node
xw.WriteStartElement("Library");
// Write the books and the book elements
xw.WriteStartElement("Book");
xw.WriteStartAttribute("BookType");
xw.WriteString("Hardback");
xw.WriteEndAttribute();
xw.WriteStartElement("Title");
xw.WriteString("Door Number Three");
xw.WriteEndElement();
xw.WriteStartElement("Author");
xw.WriteString("O'Leary, Patrick");
xw.WriteEndElement();
xw.WriteEndElement();
// Write another book
xw.WriteStartElement("Book");
xw.WriteStartAttribute("BookType");
xw.WriteString("Paperback");
xw.WriteEndAttribute();
xw.WriteStartElement("Title");
xw.WriteString("Lord of Light");
xw.WriteEndElement();
xw.WriteStartElement("Author");
xw.WriteString("Zelanzy, Roger");
xw.WriteEndElement();
xw.WriteEndElement();
// Close the document
xw.WriteEndDocument();
// Flush the write
xw.Flush();
Byte[] buffer = new Byte[ms.Length];
buffer = ms.ToArray();
string xmlOutput = System.Text.Encoding.UTF8.GetString(buffer);
.
0
ответ дан 30 November 2019 в 11:08
поделиться

Несколько лет назад я обнаружил, что произойдет, если бы я сделал свои функции :

  • Я мог бы понять их. Мой мозг маленький, а длинные функции не подходят.

  • Классы усложняются (множество функций). Но извлечение класса производится небольшими, сплоченными, однозначными классами. Опять же, маленький мозг, так Небольшие классы требуются.

  • Количество переменных в функции (или классе) мало. Вспоминание, которая из того, что из времени объявления для использования времени легко, потому что расстояние короткое .

  • Число в моих функциях в моих функциях мало, поэтому мне не нужно выяснить, какие переменные идут где.

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

Поскольку количество переменных в объеме мало, и цель очевидно, я редко нужно прилагать любые усилия, чтобы выбрать описательное имя. Поскольку я не хочу напрягать мой маленький мозг больше, чем я должен, Я никогда не сокращаюсь . Мое имя по умолчанию для переменной - это имя типа. Например. Класс Foo идет в переменной foo . В моем коде, если это когда-либо что-то другое, вы знаете, что-то особенное происходит, и вы должны обратить внимание.

В старые времена моя привычка No-abbbruviation будет производить громоздкий код, но поскольку мои методы и классы невелики, код не страдает.

-121--2422241-

Я бы предложил использовать классы в System.xml.linq.dll , которые содержат XML DOM API, который позволяет легко наращивать структуры XML из-за способа Производитель спроектированы. Попытка создать структуру XML с помощью классов System.xml очень больно, потому что вы должны создать их отсоединения, то отдельно добавляют их в документ.

Вот пример xlinq vs. system.xml для создания дома с нуля. Ваши глаза будут кровоточить, когда вы видите пример System.xml.

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

var xml = new XElement("Orders",
    new XElement("Order",
        new XAttribute("OrderNumber", 12345),
        new XElement("ItemNumber", "01234567"),
        new XElement("QTY", 10),
        new XElement("Warehouse", "PA019")
    )
);

Совет Хотя это немного неортодоксально (хотя не хуже, чем часть языка, который стал популярен в последнее время), я имел по случаю, использовал функцию с псевдонимами типа C #, чтобы минимизировать код еще дальше:

using XE = System.Xml.Linq.XElement;
using XA = System.Xml.Linq.XAttribute;
...
var xml = new XE("Orders",
    new XE("Order",
        new XA("OrderNumber", 12345),
        new XA("ItemNumber", "01234567"),
        new XA("QTY", 10),
        new XA("Warehouse", "PA019")
    )
);
9
ответ дан 30 November 2019 в 11:08
поделиться
-

В этой теме много хороших предложений, но один, который не был упомянут: определение набора данных ADO и сериализация / десериализация с использованием READXML и методы writexml . Это может быть очень простым и привлекательным решением. Ваш XML не в правильном формате, но это близко.

0
ответ дан 30 November 2019 в 11:08
поделиться

Если вы не хотите (или не можете) использовать LINQ к XML , не дублируют свой класс , чтобы включить сериализацию XML, и думает XMLWer слишком многослой, вы можете пойти с равними классическими XMLDocument класс:

// consider Order class that data structure you receive from your ERP system
List<Order> orders = YourERP.GetOrders();
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("Orders"));
foreach (Order order in orders)
{
    XmlElement item = xml.CreateElement("Order");
    item.SetAttribute("OrderNumber", order.OrderNumber);
    item.AppendChild(xml.CreateElement("ItemNumber")).Value = order.ItemNumber;
    item.AppendChild(xml.CreateElement("QTY"       )).Value = order.Quantity;
    item.AppendChild(xml.CreateElement("WareHouse" )).Value = order.WareHouse;
    xml.DocumentElement.AppendChild(item);
}
0
ответ дан 30 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

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