我有一个XML文件,有些记录缺少某些节点/元素(导入到表中所需的信息)。如果该记录缺少某个节点,则我设置一个默认值并继续下一条记录。在示例XML文件中,产品A没有条形码节点,因此根据其他信息生成该值,产品B具有所需的所有节点,因此所有值都取自节点。
<ProdExtract>
<Product>
<BasicFields>
<ProductCode>000011</ProductCode>
<LongDescription>Product A</LongDescription>
</BasicFields>
</Product>
<Product>
<BasicFields>
<ProductCode>000012</ProductCode>
<LongDescription>Product B</LongDescription>
</BasicFields>
<Barcode>
<Eancode>5391524344444</Eancode>
</Barcode>
</Product>
</ProdExtract>
我的C#代码如下。
foreach (XmlNode node in nodes)
{
XmlNodeList barcodeExists = xDoc.GetElementsByTagName("Product/Barcode");
if (barcodeExists.Count > 0)
{
/*get the inner text of that node*/
p.q_barcode = node.SelectSingleNode("Barcode/Eancode").FirstChild.InnerText;
}
else
{
/* ---
If product has no Barcode node,
Lets set our default value for products without that node
--- */
}
}
现在,当检查通过没有条形码节点的第一条记录时,它将转到else
语句并运行生成值并完美插入第一条记录所需的代码。在第二次检查所有节点的记录时,它仍然以某种方式跳转到else
并生成一个值,当它应该简单地取出&#34;的if
内部文本中的值。条形码/ Eancode&#34 ;.即使交换记录并将产品B放在第一位仍然会产生同样的问题。
我甚至尝试过以下方式,但仍未获得产品B的适当值
var barcodeExists = node.SelectSingleNode("Product/Barcode");
if (barcodeExists != null)
{
/*Barcode node exists, get the value from that node*/
p.q_barcode = node.SelectSingleNode("Barcode/Eancode").FirstChild.InnerText;
}
答案 0 :(得分:1)
要获取节点列表,您只需将节点名称传递给方法GetElementsByTagName
var node = xmlDoc.GetElementsByTagName("Barcode");
附件是在Visual Studio调试器中显示它的值的屏幕截图
另外,添加你的Xml并不完全正确。
我已将其更改为制作合适的Xml。我使用的样品是
<ProdExtract>
<Product>
<BasicFields>
<ProductCode>000011</ProductCode>
<LongDescription>Product A</LongDescription>
</BasicFields>
</Product>
<Product>
<BasicFields>
<ProductCode>000012</ProductCode>
<LongDescription>Product B</LongDescription>
</BasicFields>
<Barcode>
<Eancode>5391524344444</Eancode>
</Barcode>
</Product>
</ProdExtract>
您可以解析与此类似的Xml:
var nodeList = xmlDoc.GetElementsByTagName("Barcode");
if (nodeList != null)
{
if (nodeList.Count > 0)
{
var element = nodeList[0];
string value = element.InnerText;
}
}
基于Xml构建对象的完整方法
此方法中的逻辑是导航Xml并选择所需的值并将其设置为对象。
private static Product[] GetDetails(XmlDocument xmlDoc)
{
var result = new List<Product>();
XmlNode tempNode;
var nodeList = xmlDoc.GetElementsByTagName("Product");
foreach(XmlNode node in nodeList)
{
var product = new Product();
tempNode = node.FirstChild; //BasicFields
if (tempNode != null)
{
product.ProductCode = tempNode["ProductCode"].InnerText;
product.LongDescription = tempNode["LongDescription"].InnerText;
}
if (node.ChildNodes.Count > 1)
{
tempNode = node.ChildNodes[1];
if (tempNode != null)
{
tempNode = tempNode.FirstChild; //Eancode
if (tempNode != null)
{
product.Barcode = tempNode.InnerText;
}
}
}
result.Add(product);
}
return result.ToArray();
}
在上面的示例中,Product
是一个用于保存数据的简单类
class Product
{
public string ProductCode { get; set; }
public string LongDescription { get; set; }
public string Barcode { get; set; }
}