更新:已解决问题的更新问题是元素而不是属性,并添加了我的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>
答案 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
,这样就可以了。