XMLWriter 尝试使用重复属性

XMLWriter Trying to use duplicate attribute

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

在 XML 中不能有重复的属性。

您在示例输出中没有重复的属性,您有重复的 元素 ,这是允许的。在元素处理的开头写上 Scheds 元素的开头,在它的末尾写上 WriteEndElement(),应该没问题。

您似乎没有正确使用 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();
}