C#linq XML DeepCompare和标记删除

时间:2017-09-01 19:11:40

标签: c# .net xml linq

我正在尝试从XML中删除名为<source file="..." />的特定元素,以便我可以比较它们。

<?xml version="1.0" encoding="utf-8"?>
<!--XML document generated using OCR technology from Nuance Communications, Inc.-->
<document xmlns="http://www.nuance.com/omnipage/xml/ssdoc-schema3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <page ocr-vers="OmniPageCSDK16" app-vers="PaperVision Capture">
    <description backColor="d5d3d4">
      <source file="D:\Users\user\AppData\Roaming\OCR\\PVCPROCESSING_8\a9cfb6f2-b170-46f6-a00a-2f1557baee26.tmp" dpix="150" dpiy="150" sizex="1279" sizey="1652" />
      <theoreticalPage size="Letter" marginLeft="1700" marginTop="154" marginRight="739" marginBottom="3805" offsetX="-500" offsetY="-20" width="12240" height="15840" />
    </description>

我尝试过这些方法无济于事。它汇编很好但不起作用

doc1.Root.Element("document").Descendants().Where(e=>e.Name == "source").Remove();

doc1.Root.Element("document").Elements().Where(e=>e.Name == "source").Remove();

doc2.Root.Elements().Where(e=>e.Name == "source").Remove(); 

doc1.Descendants("document").Where(e=>e.Name == "source").Remove();

任何人都有任何关于我做错事的线索。

1 个答案:

答案 0 :(得分:3)

您没有考虑 xmlnamespace

见这个简单的例子

string xml1 = "<document> </document>";
var elem1 = XDocument.Parse(xml1).Element("document"); //elem1 contains document

现在插入一个名称空间http://aaa(如你的情况)

string xml2 = "<document xmlns=\"http://aaa\"> </document>";
var elem2 = XDocument.Parse(xml2).Element("document"); //elem2 is null

elem2 现在为空。

如何解决?使用 XNamespace

XNamespace ns = "http://aaa";
var elem3 = XDocument.Parse(xml2).Element(ns + "document"); //elem3 contains document

最后,一个更复杂的例子(查看XmlNamespace的用法):

string xml4 = "<document xmlns=\"http://aaa\"> <subitem> <subsubitem> </subsubitem> </subitem> </document>";
XNamespace ns = "http://aaa";
var elems4 = XDocument.Parse(xml4).Element(ns + "document").Descendants(ns + "subsubitem")
            .ToList();