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