【问题标题】:XMLWriter Trying to use duplicate attributeXMLWriter 尝试使用重复属性
【发布时间】:2019-01-15 23:35:26
【问题描述】:

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

【问题讨论】:

    标签: c# xml xmlwriter


    【解决方案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();
    }
    

    【讨论】:

      【解决方案2】:

      XML 中不能有重复的属性。

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

      【讨论】:

      • 我已经更新了我的代码和输出 - 元素仍然存在一些问题
      猜你喜欢
      • 2013-02-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2020-01-09
      相关资源
      最近更新 更多