XmlWriter прекращает запись в StringBuilder

У меня странная проблема. При переборе массива и создании XML с помощью XMLWriter и StringBuilder строки просто перестают добавляться в построитель строк. Я не получаю никаких ошибок до тех пор, пока не будет вызван метод XmlDoc.LoadXml, когда я получаю эту ошибку:

Произошел неожиданный конец файла. Не закрыты следующие элементы: ID, Порт, Порты. Строка 1256, позиция 39.

Когда я шагнул по коду, циклы продолжаются и не выдают ошибок, но ничего не добавляется в построитель строк.

Есть идеи? Спасибо

public XmlElement LclExportGetPorts()
    {
        DAL.DALSoapClient soapy = new DAL.DALSoapClient();
        DAL.DALStringString[] ports = soapy.EnumPortsWeb(false);
        XmlDocument XmlDoc = new XmlDocument();
        StringBuilder SB = new StringBuilder();
        XmlWriterSettings XmlSettings = new XmlWriterSettings();
        XmlSettings.Indent = true;
        using (XmlWriter writer = XmlWriter.Create(SB, XmlSettings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("Ports");
            foreach (var p in ports)
            {
                writer.WriteStartElement("Port");
                writer.WriteElementString("ID", p.Key);
                writer.WriteElementString("Name", p.Value);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
            writer.WriteEndDocument();
            string temp = writer.ToString();
            XmlDoc.LoadXml(SB.ToString());
        }
        XmlElement Result = XmlDoc.DocumentElement;
        return Result;
    }

person Community    schedule 12.07.2012    source источник
comment
Есть ли какая-то причина, по которой вы не можете просто программно создать XML-документ? Вероятно, это было бы более эффективно, разбор стоит дорого.   -  person Wug    schedule 12.07.2012


Ответы (2)


Я думаю, что работать с Linq2Xml намного проще. (Также нет необходимости сначала формировать строку xml, а затем анализировать ее, как было предложено Wug)

public XElement LclExportGetPorts()
{
    ......
    XElement xDoc = new XElement("Ports");
    foreach (var p in ports)
    {
        xDoc.Add(new XElement("Port", new XElement("ID", p.ID), 
                                      new XElement("Name", p.Name)));
    }
    return xDoc;
}
person L.B    schedule 12.07.2012

Вам нужно Flush() писателя.

person SLaks    schedule 12.07.2012