0

我有一个解析 XML 输入文件的程序。XML 有点失败。我没有开发架构,也无法控制生成 XML 的程序。这是我遇到问题的 XML 示例。

<object type="vdisk" >
<property name="mdisk_grp_id" value="many" />
<property name="mdisk_grp_name" value="many" />
<property name="mdisk_grp_id" value="10" />
<property name="mdisk_grp_name" value="VMAX5161" />
</object>

问题是同名的多个属性。显然这是不正确的。我需要选择一个没有“很多”作为值的。现在我的程序抓住了它,因为它首先发生。它破坏了程序中的其他内容。这是我尝试过的,除其他外。这是我的 VDisk 类的构造函数的部分列表。它似乎适用于输入文件中的某些“vdisk”类型的对象,但不适用于其他对象。

 public VDisk(XElement element)
    {
var mdg = from mdgs in element.Descendants("property")
                  where
                      mdgs.Attribute("name").Value == "mdisk_grp_name"
                  select mdgs;

        foreach (XElement mdgp in mdg)
        {
            if (mdgp.Attribute("value").Value != "many")
            {
                MDiskGrpName = mdgp.Attribute("value").Value;
                break;

            }
        }
}

这是引发异常的代码。没有任何 MDiskGroups 实际上被命名为“many”。所以 var 是空的。我可以捕获异常并继续,但我想将正确的数据放入 VDisk MDiskGroupName 属性。

var mdiskgrp = CurrentCluster.MDiskGroups.Where(mdg => mdg.Name == vdisk.MDiskGrpName);
                mdiskgrp.FirstOrDefault().VDiskList.Add(vdisk);
4

2 回答 2

1

尝试这个:

element.Descendants("property").Where(x => x.Attribute("name").Value == "mdisk_grp_name" && x.Attribute("value").Value != "many").First();
于 2013-05-07T02:08:22.123 回答
0

你试图在一个程序中做很多事情。将任务分解为简单任务的管道。如果您想删除除最后一个之外的所有具有给定名称的属性,请将其作为预处理转换。它只有几行代码,将其分开意味着代码是可重用的,因为它可以插入到使用此 XML 输入的任何管道中,而不会使您的“业务”逻辑混乱。转换本质上是这样的:

<xsl:template match="object">
  <xsl:copy>
    <xsl:copy select="@*"/>
    <xsl:for-each-group select="Property" group-by="@name">
       <xsl:copy-of select="current-group()[last()]"/>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>
于 2013-05-07T07:33:43.513 回答