【发布时间】: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 & Visible attributes 的数据网格视图内容保存到 xml 文件时,只有一个值应用于 Price & Visible 的所有属性。
预期结果:数据网格中的每个价格和可见值都应应用于Price & Visible attributes 的每个产品。
在调试期间,我可以看到 pp.Visible 和 pp.Price 具有正确的内容,即在数据网格中输入的值。
我不知道我使用 Foreach 循环的方法有什么问题?我怎样才能解决这个问题?谢谢
Price 是 ProductPrice 的 attribute 和
Visible 是ProductVisibility 下Visibilities 的attribute
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<Products>)); using (var writer = new XmlTextWriter(FilePath, Encoding.UTF8)) serializer.Serialize(writer, ProductPriceList);var serializer = new XmlSerializer(typeof(ObservableCollection<Products>)); using (Stream str = new FileStream(FilePath, FileMode.Open)) return (ObservableCollection<Products>)serializer.Deserialize(str); -
我通常使用 automapper 从视图模型转换为 dto 模型,然后序列化 dto。当然又回来了。您的文件是否必须看起来像具有属性的那样?
-
@Andy:我也在使用 viewmodel 但没有使用 dto 模型(从未使用过)。是的,这个 xml 文件已经以这种方式设置,我无法更改。
标签: c# xml wpf data-binding datagrid