首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找重复的XML节点并最小化XML的结构和大小

查找重复的XML节点并最小化XML的结构和大小
EN

Stack Overflow用户
提问于 2013-10-06 12:40:50
回答 1查看 100关注 0票数 0

我有当前的XML,它包含许多重复的XML。

代码语言:javascript
复制
<XML version="1.0">
  <body>
    <optionTree>
      <device modelDescription="20 Slot MX2000 Chassis, Base with 1 RE, SFBs, Fan Trays, AC Power" ProductId="1542671" modelCatalogNum="MX2020-BASE-AC" price="450000" quantity="1" userRemovable="1">
        <optionItem modelDescription="MPC Slot 0" slotIndex="1" isSingleSelected="1">
          <device modelDescription="2xTrio Chipset Enhanced MPC, 1588v2, port queuing, price includes full scale L2/L2.5 and reduced scale L3 features" ProductId="1540947" modelCatalogNum="MX-MPC2E-3D-P" price="70000">
            <optionItem modelDescription="MIC Slot 1" slotIndex="1" isSingleSelected="1">
              <device modelDescription="20x10/100/1000 MIC for MX, requires optics sold separately" ProductId="334748" modelCatalogNum="MIC-3D-20GE-SFP" price="9000">
                <optionItem modelDescription="SFP Slot 1" slotIndex="1" isSingleSelected="1">
                  <device modelDescription="SFP capable of support 10/100/1000 speeds" ProductId="291564" modelCatalogNum="SFP-1GE-FE-E-T" price="395" />
                  <device modelDescription="Small Form Factor Pluggable supporting 1000BASE-EX Gigabit Ethernet Optic Module, 40km." ProductId="205359" modelCatalogNum="SFP-GE40KM" price="2500" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-SX Gigabit Ethernet Optic Module" ProductId="51804" modelCatalogNum="SFP-1GE-SX" price="500" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-T Gigabit Ethernet Module (uses Cat 5 cable)" ProductId="51805" modelCatalogNum="SFP-1GE-T" price="395" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-LH Gigabit Ethernet Optic Module" ProductId="205257" modelCatalogNum="SFP-1GE-LH" price="5995" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-LX Gigabit Ethernet Optic Module" ProductId="51803" modelCatalogNum="SFP-1GE-LX" price="995" />
                </optionItem>
                <optionItem modelDescription="SFP Slot 2" slotIndex="2" isSingleSelected="1">
                  <device modelDescription="SFP capable of support 10/100/1000 speeds" ProductId="291564" modelCatalogNum="SFP-1GE-FE-E-T" price="395" />
                  <device modelDescription="Small Form Factor Pluggable supporting 1000BASE-EX Gigabit Ethernet Optic Module, 40km." ProductId="205359" modelCatalogNum="SFP-GE40KM" price="2500" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-SX Gigabit Ethernet Optic Module" ProductId="51804" modelCatalogNum="SFP-1GE-SX" price="500" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-T Gigabit Ethernet Module (uses Cat 5 cable)" ProductId="51805" modelCatalogNum="SFP-1GE-T" price="395" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-LH Gigabit Ethernet Optic Module" ProductId="205257" modelCatalogNum="SFP-1GE-LH" price="5995" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-LX Gigabit Ethernet Optic Module" ProductId="51803" modelCatalogNum="SFP-1GE-LX" price="995" />
                </optionItem>
                <optionItem modelDescription="SFP Slot 3" slotIndex="3" isSingleSelected="1">
                  <device modelDescription="SFP capable of support 10/100/1000 speeds" ProductId="291564" modelCatalogNum="SFP-1GE-FE-E-T" price="395" />
                  <device modelDescription="Small Form Factor Pluggable supporting 1000BASE-EX Gigabit Ethernet Optic Module, 40km." ProductId="205359" modelCatalogNum="SFP-GE40KM" price="2500" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-SX Gigabit Ethernet Optic Module" ProductId="51804" modelCatalogNum="SFP-1GE-SX" price="500" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-T Gigabit Ethernet Module (uses Cat 5 cable)" ProductId="51805" modelCatalogNum="SFP-1GE-T" price="395" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-LH Gigabit Ethernet Optic Module" ProductId="205257" modelCatalogNum="SFP-1GE-LH" price="5995" />
                  <device modelDescription="Small Form Factor Pluggable 1000Base-LX Gigabit Ethernet Optic Module" ProductId="51803" modelCatalogNum="SFP-1GE-LX" price="995" />
                </optionItem>
              </device>
            </optionItem>
          </device>
        </optionItem>
      </device>
    </optionTree>
   </body>
</XML>

我希望最小化这个XML并删除所有重复的XML节点。

我想要创建一个执行以下操作的代码:

  • 循环遍历这个XML并找到重复的"Device“元素。
  • 对于每个重复节点,除"ProductId“属性外,移除其所有属性。
  • 在底部创建一个图例如下:
  • 将创建一个名为“设备”的新元素,并包含所有删除的XML节点的详细信息。

最后的XML应该如下所示:

代码语言:javascript
复制
<XML version="1.0">
  <body>
    <optionTree>
      <device modelDescription="20 Slot MX2000 Chassis, Base with 1 RE, SFBs, Fan Trays, AC Power" ProductId="1542671" modelCatalogNum="MX2020-BASE-AC" price="450000" quantity="1" userRemovable="1">
        <optionItem modelDescription="MPC Slot 0" slotIndex="1" isSingleSelected="1">
          <device modelDescription="2xTrio Chipset Enhanced MPC, 1588v2, port queuing, price includes full scale L2/L2.5 and reduced scale L3 features" ProductId="1540947" modelCatalogNum="MX-MPC2E-3D-P" price="70000">
            <optionItem modelDescription="MIC Slot 1" slotIndex="1" isSingleSelected="1">
              <device modelDescription="20x10/100/1000 MIC for MX, requires optics sold separately" ProductId="334748" modelCatalogNum="MIC-3D-20GE-SFP" price="9000">
                <optionItem modelDescription="SFP Slot 1" slotIndex="1" isSingleSelected="1">
                  <device ProductId="291564" />
                  <device ProductId="205359" />
                  <device ProductId="51804" />
                  <device ProductId="51805" />
                  <device ProductId="205257" />
                  <device ProductId="51803" />
                </optionItem>
                <optionItem modelDescription="SFP Slot 2" slotIndex="2" isSingleSelected="1">
                  <device ProductId="291564" />
                  <device ProductId="205359" />
                  <device ProductId="51804" />
                  <device ProductId="51805" />
                  <device ProductId="205257" />
                  <device ProductId="51803" />
                </optionItem>
                <optionItem modelDescription="SFP Slot 3" slotIndex="3" isSingleSelected="1">
                  <device ProductId="291564" />
                  <device ProductId="205359" />
                  <device ProductId="51804" />
                  <device ProductId="51805" />
                  <device ProductId="205257" />
                  <device ProductId="51803" />
                </optionItem>
              </device>
            </optionItem>
          </device>
        </optionItem>
      </device>
    </optionTree>
    <devices>
      <device ProductId="291564" modelDescription="SFP capable of support 10/100/1000 speeds" modelCatalogNum="SFP-1GE-FE-E-T" price="395" />
      <device ProductId="205359" modelDescription="Small Form Factor Pluggable supporting 1000BASE-EX Gigabit Ethernet Optic Module, 40km." modelCatalogNum="SFP-GE40KM" price="2500" />
      <device ProductId="51804" modelDescription="Small Form Factor Pluggable 1000Base-SX Gigabit Ethernet Optic Module" modelCatalogNum="SFP-1GE-SX" price="500" />
      <device ProductId="51805" modelDescription="Small Form Factor Pluggable 1000Base-T Gigabit Ethernet Module (uses Cat 5 cable)" modelCatalogNum="SFP-1GE-T" price="395" />
      <device ProductId="205257" modelDescription="Small Form Factor Pluggable 1000Base-LH Gigabit Ethernet Optic Module" modelCatalogNum="SFP-1GE-LH" price="5995" />
      <device ProductId="51803" modelDescription="Small Form Factor Pluggable 1000Base-LX Gigabit Ethernet Optic Module" modelCatalogNum="SFP-1GE-LX" price="995" />
    </devices>
   </body>
</XML>

我已经找到了一个查找重复XML节点的代码,但是我想做的不仅仅是像上面描述的那样找到那些重复的节点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 07:48:02

一种快速而肮脏的解决方案,应该可以解决您的问题:

代码语言:javascript
复制
//find duplicates
var duplicates = doc.Descendants("device")
                    .GroupBy(n => n.ToString())
                    .Where(g => g.Count() > 1)
                    .ToArray();

//remove attributes on all duplicates
foreach (var attribute in duplicates.SelectMany(g => g)
                                    .SelectMany(el => el.Attributes()
                                                        .Where(attribute => attribute.Name != "ProductId"))
                                    .ToArray())
{
    attribute.Remove();
}

//add new element
doc.Descendants("body")
   .Single()
   .Add(new XElement("devices", duplicates.Select(g => XElement.Parse(g.Key))));

基本上,重复的IGrouping集合使用元素的字符串表示作为键,并保存所有重复的节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19208961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档