2016-12-12 11 views
0

いいえ、TextBlockの最後の位置にすべてComposedBlockタグを移動する必要があります。例のXMLは以下のとおりです。XML要素を特定の位置に移動する

これは、XML入力です:

<parent> 
<ComposedBlock ID="P1_CB0000001" HPOS="6278" VPOS="1670" WIDTH="3610" HEIGHT="2727"> 
    <GraphicalElement ID="P1_CB0000001_SUB" HPOS="6278" VPOS="1670" WIDTH="3610" HEIGHT="2727" /> 
</ComposedBlock> 
<ComposedBlock ID="P1_CB0000002" HPOS="653" VPOS="1728" WIDTH="1689" HEIGHT="730"> 
    <GraphicalElement ID="P1_CB0000002_SUB" HPOS="653" VPOS="1728" WIDTH="1689" HEIGHT="730" /> 
</ComposedBlock> 
<TextBlock ID="P1_TB0000006" HPOS="2539" VPOS="1675" WIDTH="1200" HEIGHT="120" LANG="en" STYLEREFS="PAR_JUSTIFIED"> 
    <TextLine ID="P1_TL0000028" HPOS="2539" VPOS="1675" WIDTH="1200" HEIGHT="120"> 
     <String ID="P1_ST0000165" HPOS="2539" VPOS="1680" WIDTH="63" HEIGHT="86" CONTENT="ijt" /> 
     <SP ID="P1_SP0000156" HPOS="2602" VPOS="1766" /> 
    </TextLine> 
</TextBlock> 
<TextBlock ID="P1_TB0000011" HPOS="4406" VPOS="5170" WIDTH="1724" HEIGHT="1003" LANG="en" STYLEREFS="PAR_JUSTIFIED"> 
    <TextLine ID="P1_TL0000083" HPOS="4411" VPOS="5170" WIDTH="1714" HEIGHT="120"> 
     <String ID="P1_ST0000532" HPOS="4411" VPOS="5170" WIDTH="346" HEIGHT="91" CONTENT="Change" /> 
     <SP ID="P1_SP0000513" HPOS="4757" VPOS="5261" /> 
     <String ID="P1_ST0000533" HPOS="4776" VPOS="5198" WIDTH="230" HEIGHT="63" CONTENT="yo0ur" /> 
     <SP ID="P1_SP0000514" HPOS="5006" VPOS="5261" /> 
    </TextLine> 
</TextBlock> 
</parent> 

、これは、所望の出力です:

<parent> 
<TextBlock ID="P1_TB0000006" HPOS="2539" VPOS="1675" WIDTH="1200" HEIGHT="120" LANG="en" STYLEREFS="PAR_JUSTIFIED"> 
    <TextLine ID="P1_TL0000028" HPOS="2539" VPOS="1675" WIDTH="1200" HEIGHT="120"> 
     <String ID="P1_ST0000165" HPOS="2539" VPOS="1680" WIDTH="63" HEIGHT="86" CONTENT="ijt" /> 
     <SP ID="P1_SP0000156" HPOS="2602" VPOS="1766" /> 
    </TextLine> 
</TextBlock> 
<TextBlock ID="P1_TB0000011" HPOS="4406" VPOS="5170" WIDTH="1724" HEIGHT="1003" LANG="en" STYLEREFS="PAR_JUSTIFIED"> 
    <TextLine ID="P1_TL0000083" HPOS="4411" VPOS="5170" WIDTH="1714" HEIGHT="120"> 
     <String ID="P1_ST0000532" HPOS="4411" VPOS="5170" WIDTH="346" HEIGHT="91" CONTENT="Change" /> 
     <SP ID="P1_SP0000513" HPOS="4757" VPOS="5261" /> 
     <String ID="P1_ST0000533" HPOS="4776" VPOS="5198" WIDTH="230" HEIGHT="63" CONTENT="yo0ur" /> 
     <SP ID="P1_SP0000514" HPOS="5006" VPOS="5261" /> 
    </TextLine> 
</TextBlock> 
<ComposedBlock ID="P1_CB0000001" HPOS="6278" VPOS="1670" WIDTH="3610" HEIGHT="2727"> 
    <GraphicalElement ID="P1_CB0000001_SUB" HPOS="6278" VPOS="1670" WIDTH="3610" HEIGHT="2727" /> 
</ComposedBlock> 
<ComposedBlock ID="P1_CB0000002" HPOS="653" VPOS="1728" WIDTH="1689" HEIGHT="730"> 
    <GraphicalElement ID="P1_CB0000002_SUB" HPOS="653" VPOS="1728" WIDTH="1689" HEIGHT="730" /> 
</ComposedBlock> 
</parent> 

とここに私のコードです:

XElement doc = XElement.Parse(reader); 
IEnumerable<XElement> wd = 
    from el in doc.Descendants("ComposedBlock").ToList() 
    select el; 

foreach (XElement el in wd) 
{ 
    //what do i need to do here? 
} 

答えて

2
  • は現在を探します」前の要素
  • あなたはこのような

何か見つかった要素の前にそれを挿入して、ツリー

  • からそれを削除します。ここ

    static void MoveElementUp(XElement element) 
    { 
        // Walk backwards until we find an element - ignore text nodes 
        XNode previousNode = element.PreviousNode; 
        while (previousNode != null && !(previousNode is XElement)) 
        { 
         previousNode = previousNode.PreviousNode; 
        } 
        if (previousNode == null) 
        { 
         throw new ArgumentException("Nowhere to move element to!"); 
        } 
        element.Remove(); 
        previousNode.AddBeforeSelf(element); 
    } 
    
  • 0

    が私の解決策

    そのない非常に良いコードが、それです作品

    私はデータ型としてXElementを使用するリストを作成しました。私は

    XDocument doc = XDocument.Parse(alto); 
           var a = doc.Descendants("TextBlock").Last(); 
           foreach (var item in lstpc) 
           { 
            a.AddAfterSelf(new XElement(item)); 
           } 
    
    1

    にVBのXML LINQと

      XElement doc = XElement.Load(FILENAME); 
          XElement parent = doc.DescendantsAndSelf("parent").FirstOrDefault(); 
          List<XElement> wd = parent.Elements("ComposedBlock").ToList(); 
    
          foreach (XElement composedBlock in wd) 
          { 
           composedBlock.ReplaceWith(null); 
          } 
          parent.Add(wd); 
    
    +1

    ReplaceWの代わりにRemove ith(null)? – CSharpie

    +0

    私はそれを考えなかった。 – jdweng

    0

    別の方法を転送する必要がある要素を追加する場所には、および/またはテストをロードするためにこれを使用して、この

    For Each el As XElement In xe...<ComposedBlock>.ToList 
         xe.Elements.LastOrDefault.AddAfterSelf(el) 
         el.Remove() 
        Next 
    

    ようになります。

    Dim xe As XElement 
        ' to load from a file 
        'xe = XElement.Load(yourpath) 
        ' for testing 
        xe = <parent> 
          <ComposedBlock ID="P1_CB0000001" HPOS="6278" VPOS="1670" WIDTH="3610" HEIGHT="2727"> 
           <GraphicalElement ID="P1_CB0000001_SUB" HPOS="6278" VPOS="1670" WIDTH="3610" HEIGHT="2727"/> 
          </ComposedBlock> 
          <ComposedBlock ID="P1_CB0000002" HPOS="653" VPOS="1728" WIDTH="1689" HEIGHT="730"> 
           <GraphicalElement ID="P1_CB0000002_SUB" HPOS="653" VPOS="1728" WIDTH="1689" HEIGHT="730"/> 
          </ComposedBlock> 
          <TextBlock ID="P1_TB0000006" HPOS="2539" VPOS="1675" WIDTH="1200" HEIGHT="120" LANG="en" STYLEREFS="PAR_JUSTIFIED"> 
           <TextLine ID="P1_TL0000028" HPOS="2539" VPOS="1675" WIDTH="1200" HEIGHT="120"> 
            <String ID="P1_ST0000165" HPOS="2539" VPOS="1680" WIDTH="63" HEIGHT="86" CONTENT="ijt"/> 
            <SP ID="P1_SP0000156" HPOS="2602" VPOS="1766"/> 
           </TextLine> 
          </TextBlock> 
          <TextBlock ID="P1_TB0000011" HPOS="4406" VPOS="5170" WIDTH="1724" HEIGHT="1003" LANG="en" STYLEREFS="PAR_JUSTIFIED"> 
           <TextLine ID="P1_TL0000083" HPOS="4411" VPOS="5170" WIDTH="1714" HEIGHT="120"> 
            <String ID="P1_ST0000532" HPOS="4411" VPOS="5170" WIDTH="346" HEIGHT="91" CONTENT="Change"/> 
            <SP ID="P1_SP0000513" HPOS="4757" VPOS="5261"/> 
            <String ID="P1_ST0000533" HPOS="4776" VPOS="5198" WIDTH="230" HEIGHT="63" CONTENT="yo0ur"/> 
            <SP ID="P1_SP0000514" HPOS="5006" VPOS="5261"/> 
           </TextLine> 
          </TextBlock> 
         </parent> 
    
    関連する問題