XMLWriter尝试使用重复属性

时间:2019-01-15 23:35:26

标签: c# xml xmlwriter

更新:已解决问题的更新问题是元素而不是属性,并添加了我的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();

在变量的Visual Studio调试器XML视图中产生以下输出:

-<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 :(得分:1)

您似乎错误地使用了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();
}

答案 1 :(得分:0)

XML中不能有重复的属性。

示例输出中没有重复的属性,具有重复的元素,这是允许的。在处理元素的开始处{} {1}}的开头,并在其结尾处Scheds,这样就可以了。