XmlDocument获取RetroPrintProduct子节点属性值失败问题排查
问题描述
使用XmlDocument解析XML文件时,仅能获取RetroPrintProduct节点的Name属性值,无法获取其子节点的Visible、Price属性值。需求如下:
- 从
RetroPrintProduct节点提取Name值 - 从
Visibilities相关节点提取Visible值 - 从
Prices相关节点提取Price值
原代码:
XmlDocument doc = new XmlDocument(); doc.Load("Prices.txt"); XmlNodeList nodes = doc.GetElementsByTagName("RetroPrintProduct"); foreach (XmlNode node in nodes) { Console.WriteLine("Name={0} ", node.Attributes["Name"].Value); foreach (XmlNode child in node.SelectNodes("ProductVisibility ")) { Console.WriteLine("Visible={0}", child.Attributes["Visible"].Value); foreach (XmlNode child2 in child.SelectNodes("Prices")) { Console.WriteLine("Price={0}", child2.Attributes["Price"].Value); } } }
XML文件内容:
<Item> <RetroPrintProduct Nino123="d89e280b-c8d5-4da2-87da-36e4a57e2867" Nino1="2022ProfileProducts.RetroPrintProduct" Sys_Index="UpdateOnly" DefaultIconName="RetroPrints_10x8x2_R_Metallic.png" DefaultOutputProfileName="Nino" DefaultOutputProfileTypeFullName="2022Profile" Name="Item Retro"> <ShippingMethodPrices Index="Replace" /> <Visibilities Index="Replace" /> </RetroPrintProduct> <RetroPrintProduct Nino123="67d1577d-7baf-4b3f-a9fb-9d52404e45f4" Nino1="2022ProfileProducts.RetroPrintProduct" Sys_Index="UpdateOnly" DefaultIconName="RetroPrints_10x8x2_S_Normal.png" DefaultOutputProfileName="Nino" DefaultOutputProfileTypeFullName="2022Profile" Name="Item 2 Retro"> <ShippingMethodPrices Index="Replace" /> <Visibilities Index="Replace"> <ProductVisibility Nino123="cc0096e0-d964-4e45-93f7-9258ddee148d" Sys_GlobalUniqueId="cc0096e0-d964-4e45-93f7-9258ddee148d" Sys_ReplicationId="39f43856-a16f-4555-b519-ccf71b97ee58" Nino1="2022.ProductVisibility" Activated="True" Noprices="False" PhotoSource="EndUserPhotos" BackgroundColor="Default" Icon="" Image="" IsUnusableByLicense="False" MaxDate="2999-12-31" MinDate="1900-01-01" Name="" Object="Visible" Visible="True" ProductLibrary="" ReplicationId="39f43856-a16f-4555-b519-ccf71b97ee58" SysCode=""> <Prices Index="Replace"> <ProductPrice Nino123="4ca2658e-3e07-4636-b33f-d87fb021288a" Sys_GlobalUniqueId="4ca2658e-3e07-4636-b33f-d87fb021288a" Sys_ReplicationId="3e75b8f4-d1b6-41fe-be9e-d2858caf6eb9" Nino1="2022.ProductPrice" FixFee="0" ServiceFee="0" Mode="Replace" FromQuantity="1" Price="0.5" ProductPriceType="PerPageQuantity" ProductLibrary="" ReplicationId="3e75b8f4-d1b6-41fe-be9e-d2858caf6eb9" SysCode="" /> </Prices> </ProductVisibility> </Visibilities> </RetroPrintProduct> </Item>
错误原因
- 节点层级不匹配:
ProductVisibility是Visibilities的子节点,并非RetroPrintProduct的直接子节点,原代码直接从RetroPrintProduct查找ProductVisibility,自然找不到。 - 属性归属错误:
Price属性属于ProductPrice节点,而非Prices节点,原代码试图从Prices节点获取该属性,结果为空。 - 选择器存在多余空格:
node.SelectNodes("ProductVisibility ")末尾的空格会导致节点匹配失败。
修正后的代码
XmlDocument doc = new XmlDocument(); doc.Load("Prices.txt"); XmlNodeList nodes = doc.GetElementsByTagName("RetroPrintProduct"); foreach (XmlNode node in nodes) { Console.WriteLine("Name={0}", node.Attributes["Name"].Value); // 遍历RetroPrintProduct下的Visibilities节点 foreach (XmlNode visibilityNode in node.SelectNodes("Visibilities")) { // 获取Visibilities内的ProductVisibility节点 foreach (XmlNode productVisNode in visibilityNode.SelectNodes("ProductVisibility")) { Console.WriteLine("Visible={0}", productVisNode.Attributes["Visible"].Value); // 遍历ProductVisibility下的Prices节点 foreach (XmlNode pricesNode in productVisNode.SelectNodes("Prices")) { // 获取Prices内的ProductPrice节点,提取Price属性 foreach (XmlNode priceNode in pricesNode.SelectNodes("ProductPrice")) { Console.WriteLine("Price={0}", priceNode.Attributes["Price"].Value); } } } } }
内容的提问来源于stack exchange,提问作者user838691
相关产品推荐
相关产品推荐

