2016-12-26 1 views
0

私は(これの5000個のインスタンス>)は、この構造以下の非常に大きな文書を持っている:XML文書内の特定のタイプのフィールドをすべて削除するにはどうすればよいですか?

<Questions> 
    <QuestionID>558013</QuestionID> 
    <Question>All of the following materials are categorized as &lt;chr8220&gt;fine art&lt;chr8221&gt; EXCEPT</Question> 
    <Answer1>textiles</Answer1> 
    <Answer2>paintings</Answer2> 
    <Answer3>drawings</Answer3> 
    <Answer4>sculptures</Answer4> 
    <Answer5>architecture</Answer5> 
    <AnswerGuide>Textile is not included in the category of fine art. Traditionally, textiles have been categorized as craft art.</AnswerGuide> 
    <TypeID>1</TypeID> 
    <Source>6,1,3</Source> 
    <Footnote /> 
    <CardTypeID>0</CardTypeID> 
    <Year>2016</Year> 
    <SubjectID>41</SubjectID> 
    <QuesNumber>4</QuesNumber> 
    <AuxNum>4</AuxNum> 
    <RandList>43512</RandList> 
    <ResourceTypeID>382</ResourceTypeID> 
    <TreeKey>01/01/01/</TreeKey> 
    <TestID>41901</TestID> 
    <DiffShort>N</DiffShort> 
    <CardType /> 
</Questions> 

私はCARDTYPEを通じてTYPEIDフィールドを必要としない、そしてそれがはるかに容易にそれらのフィールドを削除するにはなるだろう。現在、私はこのXMLを編集するためにNotepad ++を使用しているだけで、これらのフィールドとその内容をすべて削除する簡単な方法を見つけることはできません。それは可能ですか? XSLT、特に様々なエンドにXMLファイルを変換するために設計された、宣言、特別な目的の言語が使用を考えてみましょう

<Questions> 
    <QuestionID>558013</QuestionID> 
    <Question>All of the following materials are categorized as &lt;chr8220&gt;fine art&lt;chr8221&gt; EXCEPT</Question> 
    <Answer1>textiles</Answer1> 
    <Answer2>paintings</Answer2> 
    <Answer3>drawings</Answer3> 
    <Answer4>sculptures</Answer4> 
    <Answer5>architecture</Answer5> 
    <AnswerGuide>Textile is not included in the category of fine art. Traditionally, textiles have been categorized as craft art.</AnswerGuide> 
</Questions> 
+0

これを達成する方法の1つは正規表現を使用することです。必要な部分を選択し、タグの中に入れて新しいXMLファイルを作成することができます。あなたのケースのための一つの有用な正規表現(Pythonの互換性):(\ D +) \ N \ S + (。+) \ N \ S + (\ + W) \ N \ S + (\ + W)のn \ \ S + (\ + W) \ N \ S + (\ + W) \ N \ S + (\ + W) \ N \ S + (。+) caped114

+0

ああ、いや、caped114 @!現代のプログラミング(stone tabletsのどこかでエッチングされた)の一つのdefactoルールは、自然言語ではないので、[regex on X/HTML](http://stackoverflow.com/a/1732454/1422451)のドキュメントを実行することではありません。 – Parfait

答えて

0

:理想的には、上記にを簡素化します。以下は2つのアプローチです。 .xslファイルとして保存し、.xmlファイルに適用します。 XSLファイルは整形式のXMLファイルで、他のXMLと同様に解析できます。は望ましくないノードに( '「質問」せずに、すべてのノードを削除するかを削除

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Questions template --> 
    <xsl:template match="Questions"> 
    <xsl:copy> 
     <xsl:copy-of select="*[contains(name(),'Question') or contains(name(),'Answer')]"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

(「質問」またはその名前に「答え」でノードのみ保持)

キープ理想のノードその名前に回答」)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Empty template --> 
    <xsl:template match="Questions/*[not(contains(name(),'Question')) and not(contains(name(),'Answer'))]"/> 

</xsl:stylesheet> 

XSLスクリプトを実行するには?

メモ帳++自体はXSLTプロセッサではなく、エディタのみです。ほとんどの汎用言語は、Java、C#、Perl、Python、PHP、VBなど、さまざまな拡張機能やライブラリでXSLT 1.0プロセッサを搭載しています。さらに、XalanやSaxonなどの専用executablesでは、より高いレベルの2.0と3.0タイプのXSLTスクリプトも実行できます。さらに、Windows PowerShellやUnix Bashなどのコマンドラインインタプリタも実行できます。ほとんどのLinux/Mac OSには端末から実行されたxsltprocでもプリインストールされています。

警告

XSLTは、メモリ内に読み込まれ、維持されるべき文書全体を必要とするメモリを集中処理する傾向があります。そのため、小さなファイルでは優れていますが、大きなファイルではスケールされません。しかし、十分なRAM容量があれば、XMLドキュメントのサイズ(概算)の5倍から、適切な時間とリソースでそのようなXSLTを処理できます。確かに、大きな文書を小さな断片に分割すると、XSLTはさらにスムーズに実行できます。

関連する問題