XMLWriter Попытка использовать дублирующийся атрибут - PullRequest
0 голосов
/ 16 января 2019

Обновление: обновлен вопрос для решения проблемы элементов, а не атрибутов, и добавлен мой вывод XML

Я должен передать приложению некоторые строки в кодировке XML (я не часто использую языки разметки и не очень разбираюсь в их нюансах).

Формат, который мне нужно отправить, находится ниже (вне моего контроля):

<ROOT>
<Unit UnitName="Unit XYZ">
<Scheds Qty="5" ProdId="214" Comments="" />
<Scheds Qty="200" ProdId="125" Comments="Need by 1/23" />
<Scheds Qty="5000" ProdId="3100" Comments="" />
</Unit>
<Unit UnitName="Unit ABC">
<Scheds Qty="5" ProdId="214" Comments="" />
<Scheds Qty="200" ProdId="125" Comments="Need by 1/25" />
<Scheds Qty="5000" ProdId="3100" Comments="" />
</Unit>
</ROOT>

Я пытался написать это, используя XML Writer, но у меня проблемы с атрибутом Scheds, являющимся дубликатом.

Как вы можете видеть ниже, я возился с методом WriteString, но я считаю, что он нужен мне как атрибут. Мой код ниже:

 //Top level root element
                writer.WriteStartElement("ROOT");

                //loop through list and determine the pu desc to create the xml element
                foreach (Tuple<int, List<PLYOrder>> t in allOrders)
                {
                    var unit = PUList.Where(x => x.PUId == t.Item1).First().PUDesc.ToString();

                    //Start each Unit as a new element
                    writer.WriteStartElement("Unit");
                    writer.WriteAttributeString("UnitName", unit);

                    foreach(PLYOrder p in t.Item2)
                    {                      
                        var qty = $"Qty=\"{p.Qty.ToString()}\"";
                        var prodId = $"ProdId=\"{p.Product.Id.ToString()}\"";
                        var Comments = $"Comments=\"{p.Comments}\"";

                    writer.WriteStartElement("Scheds", qty);
                    writer.WriteEndElement();

                    writer.WriteStartElement("Scheds", prodId);
                    writer.WriteEndElement();

                    writer.WriteStartElement("Scheds", comments);
                    writer.WriteEndElement();

                    }
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();

Создает следующий вывод в представлении XML отладчика Visual Studio для переменной:

-<ROOT>       
-<Unit UnitName="XYZ">    
<Scheds xmlns="Qty="5""/>    
<Scheds xmlns="ProdId="360""/>    
<Scheds xmlns="Comments="hhh""/>   
<Scheds xmlns="Qty="66""/>    
<Scheds xmlns="ProdId="356""/>  
<Scheds xmlns="Comments="""/>    
</Unit>       
-<Unit UnitName="ABC">    
<Scheds xmlns="Qty="44""/>    
<Scheds xmlns="ProdId="356""/>    
<Scheds xmlns="Comments="gg""/>    
</Unit>      
</ROOT>

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Похоже, вы используете WriteStartElement неправильно. Второй параметр - это не атрибут, а URI пространства имен. Вот простой пример

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
XmlWriter writer = XmlWriter.Create(Console.Out, settings);

writer.WriteStartElement("ROOT");

writer.WriteStartElement("Unit");
writer.WriteAttributeString("UnitName", "Unit XYZ");
writer.WriteEndElement();

writer.WriteStartElement("Scheds");
writer.WriteAttributeString("Qty", "5");
writer.WriteAttributeString("ProdId", "214");
writer.WriteAttributeString("Comments", "Need by 1/25");
writer.WriteEndElement();

// Write the close tag for the root element.
writer.WriteEndElement();
writer.Close(); 

Это дает следующий вывод:

<ROOT>
  <Unit UnitName="Unit XYZ" />
  <Scheds Qty="5" ProdId="214" Comments="Need by 1/25" />
</ROOT>

Итак, из вашего примера это будет:

foreach(PLYOrder p in t.Item2)
{ 
    writer.WriteStartElement("Scheds");
    writer.WriteAttributeString("Qty", p.Qty.ToString());
    writer.WriteAttributeString("ProdId", p.Product.Id.ToString());
    writer.WriteAttributeString("Comments", p.Comments);
    writer.WriteEndElement();
}
0 голосов
/ 16 января 2019

В XML не может быть повторяющихся атрибутов.

У вас нет дублирующихся атрибутов в примере вывода, у вас есть дубликаты элементов , что разрешено. Запишите начало элемента Scheds в начале обработки для элемента и WriteEndElement() в конце, и все будет в порядке.

...