2016-12-27 14 views
0

私のXMLに問題があります。私は私のリストにxml linqは要素を削除できません

ではありませんが、そのここにddタグに

を働いていないすべてのタグを削除する必要が

は、XML入力

http://pastebin.com/J8KkkMDJ

はこちらです私のリスト。このリストは

  lstApprove.Add("Styles"); 
      lstApprove.Add("alto"); 
      lstApprove.Add("Description"); 
      lstApprove.Add("MeasurementUnit"); 
      lstApprove.Add("sourceImageInformation"); 
      lstApprove.Add("fileName"); 
      lstApprove.Add("OCRProcessing"); 
      lstApprove.Add("preProcessingStep"); 
      lstApprove.Add("processingSoftware"); 
      lstApprove.Add("softwareCreator"); 
      lstApprove.Add("softwareName"); 
      lstApprove.Add("softwareVersion"); 
      lstApprove.Add("ocrProcessingStep"); 
      lstApprove.Add("ParagraphStyle"); 
      lstApprove.Add("Layout"); 
      lstApprove.Add("Page"); 
      lstApprove.Add("PrintSpace"); 
      lstApprove.Add("TextBlock"); 
      lstApprove.Add("TextLine"); 
      lstApprove.Add("String"); 
      lstApprove.Add("SP"); 
      lstApprove.Add("ComposedBlock"); 
      lstApprove.Add("GraphicalElement"); 

、ここではリスト

   using (StreamReader reader = new StreamReader(xmlFile)) 
       { 

        nAlto = reader.ReadToEnd(); 

        nAlto = nAlto.Replace("<document xmlns=\"http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">", "<document>"); 
        nAlto = nAlto.Replace("<?xml version=\"1.0\" encoding=\"UTF-16\"?>", ""); 
       } 


       XDocument doc = XDocument.Parse(nAlto); 
        foreach (var item in doc.Descendants().ToList()) 
        { 
         if (!lstApprove.Contains(item.Name.ToString())) 
         { 
          if (item.HasElements) 
          { 
           item.ReplaceWith(item.Elements()); 
          } 
          else 
          { 
           item.Remove(); 
          } 
         } 

        } 

、ここにないタグを除去するためのコードであるXMLで許可されているタグです出力

です

このhttp://pastebin.com/XjYBTWciは、XML出力の一部である

<dd l="2342.29" t="133.12" r="2427.71" b="209.17"> 
      <TextBlock ID="P1_TB0000001" TAGREFS="LAYOUT_TAG_001" HPOS="2349.17" VPOS="160" WIDTH="71.66" HEIGHT="36.04" STYLEREFS="PAR_LEFT"> 
      <TextLine ID="P1_TL0000001" HPOS="2362.92" VPOS="160" WIDTH="44.16" HEIGHT="36.04"> 
       <String ID="P1_ST0000001" HPOS="2362.92" VPOS="160" WIDTH="44.16" HEIGHT="36.04" CONTENT="43" /> 
      </TextLine> 
      </TextBlock> 
     </dd> 

私のリストにない場合でも、私はまだddタグを持っています。どうして?ありがとうございました

+0

であるこの機能を試してみてください、あなたが削除されている要素の親を格納し、その子の上に再帰的に反復処理する必要があります第一レベルの子孫である。あなたが必要とするのは再帰です。 –

+0

あなたはそれを再帰的に行う方法を教えていただけますか? –

+0

@HristoYankov ['Descendants()'](https://msdn.microsoft.com/en-us/library/bb360635(v=vs.110).aspx)は、最初のレベルだけでなく、すべての子孫要素を返します['Elements()']](https://msdn.microsoft.com/en-us/library/bb342765(v = vs.110).aspx))。 –

答えて

1

の作品あなたのケースでは<dd>要素はxDocumentから切り離されているので、影響を受けません。この問題を克服するために、あなたは

public static void RemoveRecursive(XElement current, List<string> goodNames) 
    { 
     var parent = current; 
     if (!goodNames.Contains(current.Name.ToString())) 
     { 
      parent = current.Parent; 

      current.ReplaceWith(current.Elements()); 
     } 
     foreach (var element in parent.Elements()) 
     { 
      RemoveRecursive(element, goodNames); 
     } 

    } 

currentdoc.RootgoodNamesはあなただけ見ているからだとlstApprove

+0

完璧に働いてくれてありがとう –

0

あなたのコードの問題は、置き換え中の "/ document"に閉じるスラッシュがないことだと思います。以下のコードは、問題は、あなたがその要素とアイテムを交換する際に項目がxDocumentから削除されますので、削除要素の子要素のいずれかを削除しようとすると、その子はとてもあるということです

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      List<string> lstApprove = new List<string>() { 
       "Styles", "alto", "Description", "MeasurementUnit", 
       "sourceImageInformation", 
       "fileName", "OCRProcessing", "preProcessingStep", 
       "processingSoftware", "softwareCreator", "softwareName", 
       "softwareVersion", "ocrProcessingStep", "ParagraphStyle", 
       "Layout", "Page", "PrintSpace", "TextBlock", 
       "TextLine", "String", "SP", "ComposedBlock", "GraphicalElement" 
      }; 


      XDocument doc = XDocument.Load(FILENAME); 

      List<XElement> elements = doc.Descendants().Where(x => lstApprove.Contains(x.Name.LocalName)).ToList(); 

      string xml = "<?xml version=\"1.0\" encoding=\"UTF-16\"?>" + 
         "<document xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"></document>"; 

      XDocument newDoc = XDocument.Parse(xml); 
      XElement document = (XElement)newDoc.FirstNode; 
      document.Add(elements); 
     } 
    } 
} 
関連する問題