【问题标题】:Update to XML attribues list from datagrid从数据网格更新到 XML 属性列表
【发布时间】:2023-01-30 23:59:37
【问题描述】:

早晨:

使用下面的方法 GetProductsPriceList() 我从 XML 文件中读取选择节点的属性并将其加载到数据网格。

我编辑 Visible & Price 列的值并保存回 XML 文件。

private ObservableCollection<Products> GetProductsPriceList()
{
    productpricelist = new ObservableCollection<Products>();
    XmlDocument doc = new XmlDocument();
    doc.Load(@"C:\xmltest\26112023.txt");
    foreach (XmlElement pn in doc.SelectNodes("/Data/Products/*"))
    {
        var productlist = new Products
        {
            Mainproduct = pn.LocalName.ToString(),
            Name = pn.GetAttribute("Name"),
            Price = pn.SelectSingleNode(".//ProductPrice/@Price")?.Value,
            Visible = pn.SelectSingleNode(".//ProductVisibility/@Visible")?.Value,
            NameIcon = pn.GetAttribute("DefaultIconName")
        };
        productpricelist.Add(productlist);
    }

    return productpricelist;
}

我的问题是,当我尝试使用 Price &amp; Visible attributes 的数据网格视图内容保存到 xml 文件时,只有一个值应用于 Price &amp; Visible 的所有属性。

预期结果:数据网格中的每个价格和可见值都应应用于Price &amp; Visible attributes 的每个产品。

在调试期间,我可以看到 pp.Visiblepp.Price 具有正确的内容,即在数据网格中输入的值。

我不知道我使用 Foreach 循环的方法有什么问题?我怎样才能解决这个问题?谢谢

PriceProductPriceattributeVisibleProductVisibilityVisibilitiesattribute

private void Execute(object parm) //method to save back to the xml file price & visible attributes for each products 
{

    XmlDocument doc = new XmlDocument();
    doc.Load(@"C:\xmltest\26112023.txt");
    foreach (Products pp in productpricelist)
    {
        foreach (XmlElement pn in doc.SelectNodes("/Data/Products/*"))
    {

        
            foreach (XmlNode visibility in pn.SelectNodes("Visibilities"))
            {
                foreach (XmlNode productVisibilty in visibility.SelectNodes("ProductVisibility"))
                {
                    productVisibilty.Attributes["Visible"].InnerText = pp.Visible;

                    foreach (XmlNode price in productVisibilty.SelectNodes("Prices"))
                    {
                        foreach (XmlNode productPrice in price.SelectNodes("ProductPrice"))
                        {
                            productPrice.Attributes["Price"].InnerText = pp.Price;
                        }
                    }
                }
            }
        }

            }
doc.Save(@"C:\xmltest\26112023_.txt");
}

示例 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<Data>
  <ShippingMethodsReferences />
  <Products>
    <ProductApple ID="77f9df03-7525-44d7-b08d-dcf106b44969" Sys_Type="Library.Domain.Products.ProductApple" Sys_ImportStrategy="UpdateOnly" DefaultIconName="Xerox_10x8x2_R_Sticker.png" Profile="Fruits" DefaultOutputProfileTypeFullName="Output" Name="(10x8)x2 H Rectangular">
      <ShippingMethodPrices ImportStrategy="Replace" />
      <Visibilities ImportStrategy="Replace">
        <ProductVisibility ID="adfa5eca-3f58-4107-8738-5b9b1c0b666f" Sys_GlobalUniqueId="adfa5eca-3f58-4107-8738-5b9b1c0b666f" Sys_ReplicationId="ee46c28d-7b82-447d-a3a9-a67e0e4bbd5b" Sys_Type="ProductVisi" Activated="True" OverrideServerProductPrices="False" PhotoSource="EndUserPhotos" BackgroundColor="Default" Icon="" Image="" IsUnusableByLicense="False" MaxDate="2999-12-31" MinDate="1900-01-01" Name="" OrderableObjectVisibility="Visible" Visible="True" ReplicationId="ee46c28d-7b82-447d-a3a9-a67e0e4bbd5b">
          <Prices ImportStrategy="Replace">
            <ProductPrice ID="e558ceed-1e64-4540-8958-0203fea2b53b" Sys_GlobalUniqueId="e558ceed-1e64-4540-8958-0203fea2b53b" Sys_ReplicationId="2810c015-da9b-4aa9-ad43-ac7c02341b79" Sys_Type="Library.Domain.ProductPrice" FixFee="0" ServiceFee="0" Mode="Replace" FromQuantity="1" Price="0" ProductPriceType="PerPageQuantity" ReplicationId="2810c015-da9b-4aa9-ad43-ac7c02341b79" />
          </Prices>
        </ProductVisibility>
      </Visibilities>
    </ProductApple>
    <ProductSolo ID="7c1302d8-8832-451b-be64-c5d048d0332f" Sys_Type="Library.Domain.Products.ProductApple" Sys_ImportStrategy="UpdateOnly" DefaultIconName="Xerox_10x8x2_R_Metallic.png" Profile="Fruits" DefaultOutputProfileTypeFullName="Output" Name="(10x8)x2 H Rectangular">
      <ShippingMethodPrices ImportStrategy="Replace" />
      <Visibilities ImportStrategy="Replace">
        <ProductVisibility ID="078f6e6a-895c-4957-b808-2b38589ba4cd" Sys_GlobalUniqueId="078f6e6a-895c-4957-b808-2b38589ba4cd" Sys_ReplicationId="e0ca0706-0113-4479-ab47-59d2b14bf837" Sys_Type="ProductVisi" Activated="True" OverrideServerProductPrices="False" PhotoSource="EndUserPhotos" BackgroundColor="Default" Icon="" Image="" IsUnusableByLicense="False" MaxDate="2999-12-31" MinDate="1900-01-01" Name="" OrderableObjectVisibility="Visible" Visible="True" ReplicationId="e0ca0706-0113-4479-ab47-59d2b14bf837">
          <Prices ImportStrategy="Replace">
            <ProductPrice ID="0c14f953-9f75-4e24-9c38-245027107167" Sys_GlobalUniqueId="0c14f953-9f75-4e24-9c38-245027107167" Sys_ReplicationId="2d243d53-cd0c-4a92-adea-919a9bcb427d" Sys_Type="Library.Domain.ProductPrice" FixFee="0" ServiceFee="0" Mode="Replace" FromQuantity="1" Price="0" ProductPriceType="PerPageQuantity" ReplicationId="2d243d53-cd0c-4a92-adea-919a9bcb427d" />
          </Prices>
        </ProductVisibility>
      </Visibilities>
    </ProductSolo>
    </Data>
</Products>

【问题讨论】:

  • 保存时,您覆盖了整个文件。所以我会把整个文件翻译成产品的集合。即使您编辑它们的某些子选择。然后将整个产品列表转换回 xml 并保存文件。但如果我可以控制 xml 文件的外观,我宁愿只将一个类序列化到磁盘并将其反序列化。
  • @Andy 实际上我尝试序列化/反序列化但它不起作用,因为它是一个复杂的文件。 var serializer = new XmlSerializer(typeof(ObservableCollection&lt;Products&gt;)); using (var writer = new XmlTextWriter(FilePath, Encoding.UTF8)) serializer.Serialize(writer, ProductPriceList); var serializer = new XmlSerializer(typeof(ObservableCollection&lt;Products&gt;)); using (Stream str = new FileStream(FilePath, FileMode.Open)) return (ObservableCollection&lt;Products&gt;)serializer.Deserialize(str);
  • 我通常使用 automapper 从视图模型转换为 dto 模型,然后序列化 dto。当然又回来了。您的文件是否必须看起来像具有属性的那样?
  • @Andy:我也在使用 viewmodel 但没有使用 dto 模型(从未使用过)。是的,这个 xml 文件已经以这种方式设置,我无法更改。

标签: c# xml wpf data-binding datagrid


【解决方案1】:

            foreach (XmlNode visibility in pn.SelectNodes("Visibilities"))
            {
                foreach (XmlNode productVisibilty in visibility.SelectNodes("ProductVisibility"))
                {
                    productVisibilty.Attributes["Visible"].InnerText = pp.Visible;

                    foreach (XmlNode price in productVisibilty.SelectNodes("Prices"))
                    {
                        foreach (XmlNode productPrice in price.SelectNodes("ProductPrice"))
                        {
                            productPrice.Attributes["Price"].InnerText = pp.Price;
                        }
                    }
                }
            }

您必须检查 pp 中的产品是否等于 pn 中的产品。如果不是,您可以设置所有使用doc.SelectNodes("/Data/Products/*") 选择的产品的可见和价格属性,而不仅仅是第 pp 中的产品。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2020-12-06
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多