【问题标题】:Create a XML File from a list based on a conditional根据条件从列表创建 XML 文件
【发布时间】:2016-06-07 15:08:38
【问题描述】:

我已经尝试了几个小时来理解这一点,但没有成功。 我有一个基于类的列表:

public class xmldata //Class to receive items list
{
    public string xml_filename { get; set; }
    public string colorname { get; set; }
    public string colorvalues { get; set; }

}

然后我做了一个单独的类来保存列表:

public class xmldatalist
{
    public List<xmldata> FullList = new List<xmldata>();
}

这个列表(FullList)的每个位置都包含来自 xmldata 的三个元素 - 我要关注的特定元素是 xml_filename。

我的问题是:我怎样才能有一个 foreach 循环来迭代这个列表,并为每个 xml_filename 值生成一个 XML 文件。

即: 从位置 0 到 5 , xml_filename 是 file1.bla 从位置 6 到 9 ,xml_filename 是 file2.bla

我想要一个 foreach 来遍历位置 0 到 5 ,检查 xml_filename 是否为 file1.bla 并写入位置 0 到 5 的属性。

类似:

检查 xml_filename 创建文件 写入属性 如果 xml_filename 在下一个位置相同 继续写这个文件 如果 xml_file 在下一个位置不同,则写入新文件

现在我正在尝试通过这样做来使用 Linq:

foreach (var ListXmlFileName in XMLList.FullList.Where(x => x.xml_filename == XmlFilename))
{
}

但我有点不知道如何继续。 我尝试的另一种方法是:

foreach (xmldata XmlStuff in XmlItems.ItemsList)
{
}

也没有成功。编写 XML 的代码是:

public void writexml(xmldatalist XmlItems, variables GlobalVars)
{
    XmlWriterSettings settings = new XmlWriterSettings
    {
        Indent = true,
        IndentChars = "\t",
        NewLineChars = Environment.NewLine,
        NewLineHandling = NewLineHandling.Replace,
        Encoding = new UTF8Encoding(false)
    };
    int pos = 0;



    foreach (xmldata XmlStuff in XmlItems.ItemsList)
    {

        string DesktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
        string XmlFilename = "dadada";
        string FileExtension = ".xml";
        string PathString = Path.Combine(DesktopFolder, "XML");
        System.IO.Directory.CreateDirectory(PathString);
        string FullPath = Path.Combine(PathString, XmlFilename + FileExtension);

        XmlWriter XmlWriting = XmlWriter.Create(FullPath, settings);

            XmlWriting.WriteStartDocument();
            XmlWriting.WriteStartElement("JMF");
            XmlWriting.WriteAttributeString("SenderID", "InkZone-Controller");
            XmlWriting.WriteAttributeString("Version", "1.2");
            //XmlWriting.WriteAttributeString("xmlns","",null, "http://www.CIP4.org/JDFSchema_1_1");

            XmlWriting.WriteStartElement("Command");
            XmlWriting.WriteAttributeString("ID", "cmd.00695");
            XmlWriting.WriteAttributeString("Type", "Resource");


            XmlWriting.WriteStartElement("ResourceCMDParams");
            XmlWriting.WriteAttributeString("ResourceName", "InkZoneProfile");
            XmlWriting.WriteAttributeString("JobID", "K_41");


            XmlWriting.WriteStartElement("InkZoneProfile");
            XmlWriting.WriteAttributeString("ID", "r0013");
            XmlWriting.WriteAttributeString("Class", "Parameter");
            XmlWriting.WriteAttributeString("Locked", "false");
            XmlWriting.WriteAttributeString("Status", "Available");
            XmlWriting.WriteAttributeString("PartIDKeys", "SignatureName SheetName Side Separation");
            XmlWriting.WriteAttributeString("DescriptiveName", "Schieberwerte von DI");
            XmlWriting.WriteAttributeString("ZoneWidth", "32");


            XmlWriting.WriteStartElement("InkZoneProfile");
            XmlWriting.WriteAttributeString("SignatureName", "SIG1");

            XmlWriting.WriteStartElement("InkZoneProfile");
            XmlWriting.WriteAttributeString("Locked", "False");
            XmlWriting.WriteAttributeString("SheetName", "S1");

            XmlWriting.WriteStartElement("InkZoneProfile");
            XmlWriting.WriteAttributeString("Side", "Front");

我也尝试过,但没有按预期工作(while 循环)

       while(XmlStuff.xml_filename == XmlItems.ItemsList[pos].xml_filename)
        {
            XmlWriting.WriteStartElement("InkZoneProfile");
            XmlWriting.WriteAttributeString("Separation", XmlItems.ItemsList[pos].colorname);
            XmlWriting.WriteAttributeString("ZoneSettingsX", XmlItems.ItemsList[pos].colorvalues);
            XmlWriting.WriteEndElement();
            pos++;
        }
    XmlWriting.WriteEndDocument();
    XmlWriting.Close();     
    }
}

任何帮助将不胜感激。非常感谢。

**

编辑:XML 示例

**.

<?xml version="1.0" encoding="utf-8"?>
<JMF SenderID="InkZone-Controller" Version="1.2" xmlns="http://www.CIP4.org/JDFSchema_1_1">
    <Command ID="cmd.00695" Type="Resource">
        <ResourceCmdParams ResourceName="InkZoneProfile" JobID="K_41">
            <InkZoneProfile ID="r0013" Class="Parameter" Locked="false" Status="Available" PartIDKeys="SignatureName SheetName Side Separation" DescriptiveName="Schieberwerte von DI" ZoneWidth="32">
                <InkZoneProfile SignatureName="SIG1">
                    <InkZoneProfile Locked="false" SheetName="S1">
                        <InkZoneProfile Side="Front">
                            <InkZoneProfile Separation="designer P&G 1901" ZoneSettingsX="0.391 0.36 0.097 0.058 0 0 0 0 0 0 0 0 0.178 0.394 0.201 0.088"/>
                            <InkZoneProfile Separation="designer P&G 0323" ZoneSettingsX="0.011 0.028 0.02 0.021 0.079 0.071 0.046 0.059 0.043 0.062 0.044 0.094 0.024 0.037 0.012 0.023"/>
                            <InkZoneProfile Separation="designer P&G 0068" ZoneSettingsX="0 0.04 0.03 0.016 0.08 0.005 0.041 0.036 0.034 0.044 0.028 0.072 0.001 0.005 0.063 0.008"/>
                            <InkZoneProfile Separation="designer P&G 0056" ZoneSettingsX="0 0.064 0.053 0.032 0.137 0.022 0.164 0.097 0.153 0.11 0.052 0.127 0.01 0.007 0.108 0.008"/>
                            <InkZoneProfile Separation="designer P&G 0306" ZoneSettingsX="0 0 0 0.19 0.187 0.259 0.224 0.178 0.24 0.185 0.249 0.188 0.173 0 0 0.004"/>
                            <InkZoneProfile Separation="designer P&G 0016" ZoneSettingsX="0.069 0.1 0.21 0.049 0.07 0.027 0.138 0.265 0.134 0.242 0.056 0.066 0.039 0.09 0.17 0.13"/>
                            <InkZoneProfile Separation="designer P&G 0057" ZoneSettingsX="0 0 0 0 0.023 0.001 0.012 0.012 0.008 0.016 0.003 0.021 0.001 0 0 0.004"/>
                            <InkZoneProfile Separation="Keyline" ZoneSettingsX="0.013 0.006 0.006 0.038 0.007 0.033 0.012 0.026 0.018 0.02 0.016 0.007 0.034 0.006 0.006 0.022"/>
                        </InkZoneProfile>
                    </InkZoneProfile>
                </InkZoneProfile>
            </InkZoneProfile>

这样会更准确:

<InkZoneProfile Separation="Cyan" ZoneSettingsX="0.391 0.36 0.097 0.058 0 0 0 0 0 0 0 0 0.178 0.394 0.201 0.088"/>

让我们假设它属于 file1。 File1 将有五个 SomeColor 和 SomeValues 在列表的每个位置。

【问题讨论】:

  • 您列出的内容是name_a, name_a, name_a, name_b, name_b, name_b, name_b, name_b,... 还是随机的,例如:name_b, name_b, name_a, name_a, name_b,...?
  • 我不明白。让我试着改写。从位置 0 到 5 ,每个位置都有三个项目:颜色名称、颜色值和 xml_filename。 colorname 和 colorvalues 将被写入 xml 文件。 xml_filename 是该文件的名称,并且在位置 0 到 5 之间将具有相同的值。我需要执行类似“分组”这些位置的操作,将我需要的关于它们的所有内容写入(写入名为 xml_filename 的 xml 文件)并移至下一个。
  • @Sakura 抱歉,现在我明白了你的问题。是的,它遵循这种模式。从位置 0 到 5 xml_filename 是 name_a。从位置 6 到 10 xml_filename 是 name_b ,依此类推...
  • 我在您的 XML 文件中没有看到您的 xmldata 类。这个xml是否属于其他项目?如果是这样,问其他问题,我会回答你。每个问题你应该只问一个问题。我希望在您的 xml 内容中看到如下内容:&lt;xmldata&gt; &lt;xml_filename&gt;D:\File_One&lt;/xml_filename&gt; &lt;colorname&gt;Blue&lt;/colorname&gt; &lt;colorvalues&gt;#0000FF&lt;/colorvalues&gt; &lt;/xmldata&gt;。
  • xml_filename 仅用于识别目的 - 他不会进入最终的 xml。 xmldata 类与其他类一起位于问题的顶部(第一个文本)。

标签: c# xml linq foreach xmlwriter


【解决方案1】:

这是你想要的吗:

[Serializable]
[XmlType("InkZoneProfile")]
public class xmldata //Class to receive items list
{
    [XmlIgnore]
    public string xml_filename { get; set; }

    [XmlAttribute("Separation")]
    public string colorname { get; set; }

    [XmlAttribute("ZoneSettingsX")]
    public string colorvalues { get; set; }

}

FullList.Add(new xmldata { xml_filename = @"D:\File_One", colorname = "Red", colorvalues = "#FF0000" });
FullList.Add(new xmldata { xml_filename = @"D:\File_One", colorname = "Blue", colorvalues = "#0000FF" });
FullList.Add(new xmldata { xml_filename = @"D:\File_Two", colorname = "Black", colorvalues = "#000000" });
FullList.Add(new xmldata { xml_filename = @"D:\File_Two", colorname = "White", colorvalues = "#FFFFFF" });

Dictionary<string, List<xmldata>> xmlFiles = new Dictionary<string, List<xmldata>>();
foreach (var item in FullList)
{
    if (!xmlFiles.ContainsKey(item.xml_filename)) xmlFiles[item.xml_filename] = new List<xmldata>();
    xmlFiles[item.xml_filename].Add(item);
}

foreach (var i in xmlFiles)
{
    string yourXMLFileName = i.Key;
    List<xmldata> xmlDataOfThisFile = i.Value;
    Console.WriteLine(yourXMLFileName);
    try
    {
        using (FileStream fs = new FileStream(yourXMLFileName, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<xmldata>));
            serializer.Serialize(fs, FullList);
        }
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
        Console.WriteLine(ex.InnerException);
    }
}

这将创建这个 XML:

<?xml version="1.0"?>
<ArrayOfInkZoneProfile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <InkZoneProfile Separation="Red" ZoneSettingsX="#FF0000" />
  <InkZoneProfile Separation="Blue" ZoneSettingsX="#0000FF" />
  <InkZoneProfile Separation="Black" ZoneSettingsX="#000000" />
  <InkZoneProfile Separation="White" ZoneSettingsX="#FFFFFF" />
</ArrayOfInkZoneProfile>

编辑

根据您的评论,您还有其他问题。当标题问题的问题现在解决时,您应该用其他问题提出新问题。不要在这里合并。

【讨论】:

  • 在将数据写入磁盘之前填充它。在writexml里面可以OK
  • 基本上就是这个。但是我将如何从每个列表位置编写三个字段 - 我没有得到这部分。在之前的代码中,我有这个: xmlWriter.WriteStartElement("InkZoneProfile"); xmlWriter.WriteAttributeString("分离", currentcolor); xmlWriter.WriteAttributeString("ZoneSettingsX", pantone647cvalues); xmlWriter.WriteEndElement(); - 这将为该值写入 XML 数据(它基于 if 条件)。您的字典想法按其 xml_filename 对我的元素进行了分组-但是我如何遍历其其他字段?即:一个文件名有 5 种颜色。
  • 您能否发布一个您的 XML 文件内容的示例,以便我更清楚地理解。我看到您还没有编辑问题的权利,所以将其发布为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多