2017-02-18 11 views
-1

このxmlを使用してxsdを準備し、さらに行を処理してデータをデータベースに挿入したいと考えています。 xsdを準備するために、xsltを使用して構造を望ましいフォーマットに変換します。ノードの値にURLが含まれている場合、XMLノードを削除するにはどうすればよいですか?

<linked-hash-map> 
    <entry> 
    <string>_type</string> 
    <string>News</string> 
    </entry> 
    <entry> 
    <string>value</string> 
    <list> 
     <linked-hash-map> 
     <entry> 
      <string>name</string> 
      <string> 
      Virat Kohli 
      </string> 
     </entry> 
     <entry> 
      <string>url</string> 
      <string> 
      http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&CID=09E4F1057ADB64720330FB2E7BC96547&rd=1&h=nw8K4uNRgs-nvsuz2GyXpqMxdRmzWK8Xbm3W_1IlO24&v=1&r=http%3a%2f%2fmovies.ndtv.com%2fbollywood%2fvirat-kohli-hearts-anushka-sharma-a-timeline-of-their-romance-1659877&p=DevEx,5026.1 
      </string> 
     </entry> 
     <entry> 
      <string>image</string> 
      <linked-hash-map> 
      <entry> 
       <string>thumbnail</string> 
       <linked-hash-map> 
       <entry> 
        <string>contentUrl</string> 
        <string> 
        https://www.bing.com/th?id=ON.EE674002EC235BD5795D34695EABF504&pid=News 
        </string> 
       </entry> 
       <entry> 
        <string>width</string> 
        <int>640</int> 
       </entry> 
       </linked-hash-map> 
      </entry> 
      </linked-hash-map> 
     </entry> 
     <entry> 
      <string>description</string> 
      <string> 
      On Wednesday, cricketer Virat Kohli 
      </string> 
     </entry> 
     <entry> 
      <string>datePublished</string> 
      <string>2017-02-16T05:39:00</string> 
     </entry> 
     <entry> 
      <string>category</string> 
      <string>Entertainment</string> 
     </entry> 
     </linked-hash-map> 
     <linked-hash-map> 
     <entry> 
      <string>name</string> 
      <string> 
      Shah Rukh Khan’s TV show 
      </string> 
     </entry> 
     <entry> 
      <string>url</string> 
      <string> 
      http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&CID=09E4F1057ADB64720330FB2E7BC96547&rd=1&h=4CnQhOg9Nm7pmIu9OvDl6x9WtYtSuXblCSR_WQz1VoA&v=1&r=http%3a%2f%2fwww.hindustantimes.com%2ftv%2fshah-rukh-khan-s-tv-show-circus-is-back-on-small-screen%2fstory-OjQUQIWi6ogxj5eF1hivTI.html&p=DevEx,5040.1 
      </string> 
     </entry> 
     <entry> 
      <string>image</string> 
      <linked-hash-map> 
      <entry> 
       <string>thumbnail</string> 
       <linked-hash-map> 
       <entry> 
        <string>contentUrl</string> 
        <string> 
        https://www.bing.com/th?id=ON.2974262BB8317FA4D4BCE4A61CA9488E&pid=News 
        </string> 
       </entry> 
       <entry> 
        <string>width</string> 
        <int>700</int> 
       </entry> 
       </linked-hash-map> 
      </entry> 
      </linked-hash-map> 
     </entry> 
     <entry> 
      <string>description</string> 
      <string> 
      Here’s some wonderful news 
      </string> 
     </entry> 
     <entry> 
      <string>datePublished</string> 
      <string>2017-02-16T05:36:00</string> 
     </entry> 
     <entry> 
      <string>category</string> 
      <string>Entertainment</string> 
     </entry> 
     </linked-hash-map> 
    </list> 
    </entry> 
</linked-hash-map> 

ここで、URLにはクエリーストリングがあります。どのようにURLを削除するか、またはクエリ文字列でURLをエンコードする方法は?

所望の出力:以下

<?xml version="1.0" encoding="utf-8"?> 
<linked-hash-map> 
    <entry> 
    <linked-hash-map> 
     <_type>News</_type> 
     <datarow> 
     <name> Virat Kohli</name> 
     <url>http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&CID=09E4F1057ADB64720330FB2E7BC96547&rd=1&h=nw8K4uNRgs-nvsuz2GyXpqMxdRmzWK8Xbm3W_1IlO24&v=1&r=http%3a%2f%2fmovies.ndtv.com%2fbollywood%2fvirat-kohli-hearts-anushka-sharma-a-timeline-of-their-romance-1659877&p=DevEx,5026.1</url> 
     <contentUrl> https://www.bing.com/th?id=ON.EE674002EC235BD5795D34695EABF504&pid=News </contentUrl> 
     <width>640</width> 
     <description> On Wednesday, cricketer Virat Kohli</description> 
     <readLink> https://api.cognitive.microsoft.com/api/v5/entities/b8ef6b82-02be-1e24-584c-f8283b7bdaeb </readLink> 
     <datePublished>2017-02-16T05:39:00</datePublished> 
     <category>Entertainment</category>  
     </datarow> 
     <datarow> 
     <name> Shah Rukh Khan’s TV show</name> 
     <url> http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&CID=09E4F1057ADB64720330FB2E7BC96547&rd=1&h=4CnQhOg9Nm7pmIu9OvDl6x9WtYtSuXblCSR_WQz1VoA&v=1&r=http%3a%2f%2fwww.hindustantimes.com%2ftv%2fshah-rukh-khan-s-tv-show-circus-is-back-on-small-screen%2fstory-OjQUQIWi6ogxj5eF1hivTI.html&p=DevEx,5040.1 </url> 
     <contentUrl> https://www.bing.com/th?id=ON.EE674002EC235BD5795D34695EABF504&pid=News </contentUrl> 
     <width>640</width> 
     <description> Here’s some wonderful news </description> 
     <readLink> https://api.cognitive.microsoft.com/api/v5/entities/b8ef6b82-02be-1e24-584c-f8283b7bdaeb </readLink> 
     <datePublished>2017-02-16T05:39:00</datePublished> 
     <category>Entertainment</category> 
     </datarow> 
    </linked-hash-map> 
    </entry> 
</linked-hash-map> 

は、私は、この構造を変換するために使用されるスクリプトです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/linked-hash-map"> 
    <xsl:element name="{local-name()}"> 
     <xsl:for-each select="entry"> 
     <xsl:choose> 
      <xsl:when test="list/linked-hash-map"> 
      <xsl:for-each select="list/linked-hash-map"> 
       <datarow> 
       <xsl:for-each select="entry"> 
        <xsl:if test="not(node()[1]='image' or node()[1]='about' or node()[1]='clusteredArticles' or node()[1]='mentions' or node()[1]='provider' or node()[1]='url' or node()[1]='description' or node()[1]='name')"> 
        <xsl:text disable-output-escaping="yes">&lt;</xsl:text> 
        <xsl:value-of select="*[1]"/> 
        <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
        <xsl:value-of select="*[2]"/> 
        <xsl:text disable-output-escaping="yes">&lt;/</xsl:text> 
        <xsl:value-of select="*[1]"/> 
        <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
       </datarow> 
      </xsl:for-each> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> 
      <xsl:value-of select="*[1]"/> 
      <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
      <xsl:value-of select="*[2]"/> 
      <xsl:text disable-output-escaping="yes">&lt;/</xsl:text> 
      <xsl:value-of select="*[1]"/> 
      <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:for-each> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="/"> 
    <xsl:copy> 
     <linked-hash-map> 
     <entry> 
      <xsl:apply-templates/> 
     </entry> 
     </linked-hash-map> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

あなたの試みたスクリプトはどこですか?どのようなエラーや望ましくない結果がありますか? – Parfait

+0

私はどんなスクリプトでも動いているが、最初はそれが自己で失敗している。先に進むために、私はjavaコードを使って&記号を操作し、空白に置き換えました。私は投稿を更新しました。上記を参照してください。 – user3187932

答えて

0

URLで使用アンパサンドがXML entity references、すなわち&amp;対応に置き換える必要があり、現在、あなたのオリジナルのXMLが整形式ではありません。

元のXMLを連結文字列のテキストファイルとして開発しないでください(このマークアップが構築されている可能性があります)。残念ながら、これは汎用プログラミングでは一般的な方法です。 XML文書は、W3C準拠のDOMライブラリで構築されなければならない(つまり、Javaのjavax.xml、Pythonのxml.etree、PHPのDOMDocument、.NETのXmlDocument)そのcreateElementappendChildsetAttribute、または対応するメソッドを持ちます。

有効なXMLがレンダリングされたら、より一般化可能なXSLTを以下で検討してください。

入力(文字エンティティのために調整)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<linked-hash-map> 
    <entry> 
    <string>_type</string> 
    <string>News</string> 
    </entry> 
    <entry> 
    <string>value</string> 
    <list> 
     <linked-hash-map> 
     <entry> 
      <string>name</string> 
      <string> 
      Virat Kohli 
      </string> 
     </entry> 
     <entry> 
      <string>url</string> 
      <string> 
      http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&amp;CID=09E4F1057ADB64720330FB2E7BC96547&amp;rd=1&amp;h=nw8K4uNRgs-nvsuz2GyXpqMxdRmzWK8Xbm3W_1IlO24&amp;v=1&amp;r=http%3a%2f%2fmovies.ndtv.com%2fbollywood%2fvirat-kohli-hearts-anushka-sharma-a-timeline-of-their-romance-1659877&amp;p=DevEx,5026.1 
      </string> 
     </entry> 
     <entry> 
      <string>image</string> 
      <linked-hash-map> 
      <entry> 
       <string>thumbnail</string> 
       <linked-hash-map> 
       <entry> 
        <string>contentUrl</string> 
        <string> 
        https://www.bing.com/th?id=ON.EE674002EC235BD5795D34695EABF504&amp;pid=News 
        </string> 
       </entry> 
       <entry> 
        <string>width</string> 
        <int>640</int> 
       </entry> 
       </linked-hash-map> 
      </entry> 
      </linked-hash-map> 
     </entry> 
     <entry> 
      <string>description</string> 
      <string> 
      On Wednesday, cricketer Virat Kohli 
      </string> 
     </entry> 
     <entry> 
      <string>datePublished</string> 
      <string>2017-02-16T05:39:00</string> 
     </entry> 
     <entry> 
      <string>category</string> 
      <string>Entertainment</string> 
     </entry> 
     </linked-hash-map> 
     <linked-hash-map> 
     <entry> 
      <string>name</string> 
      <string> 
      Shah Rukh Khan's TV show 
      </string> 
     </entry> 
     <entry> 
      <string>url</string> 
      <string> 
      http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&amp;CID=09E4F1057ADB64720330FB2E7BC96547&amp;rd=1&amp;h=4CnQhOg9Nm7pmIu9OvDl6x9WtYtSuXblCSR_WQz1VoA&amp;v=1&amp;r=http%3a%2f%2fwww.hindustantimes.com%2ftv%2fshah-rukh-khan-s-tv-show-circus-is-back-on-small-screen%2fstory-OjQUQIWi6ogxj5eF1hivTI.html&amp;p=DevEx,5040.1 
      </string> 
     </entry> 
     <entry> 
      <string>image</string> 
      <linked-hash-map> 
      <entry> 
       <string>thumbnail</string> 
       <linked-hash-map> 
       <entry> 
        <string>contentUrl</string> 
        <string> 
        https://www.bing.com/th?id=ON.2974262BB8317FA4D4BCE4A61CA9488E&amp;pid=News 
        </string> 
       </entry> 
       <entry> 
        <string>width</string> 
        <int>700</int> 
       </entry> 
       </linked-hash-map> 
      </entry> 
      </linked-hash-map> 
     </entry> 
     <entry> 
      <string>description</string> 
      <string> 
      Here's some wonderful news 
      </string> 
     </entry> 
     <entry> 
      <string>datePublished</string> 
      <string>2017-02-16T05:36:00</string> 
     </entry> 
     <entry> 
      <string>category</string> 
      <string>Entertainment</string> 
     </entry> 
     </linked-hash-map> 
    </list> 
    </entry> 
</linked-hash-map> 

XSLT(インラインコメントを参照してください)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- APPLY ONLY SECOND ENTRY OFF ROOT --> 
    <xsl:template match="/linked-hash-map"> 
    <xsl:copy>  
     <xsl:apply-templates select="entry[2]"/>  
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="entry[2]"> 
    <xsl:copy> 
     <!-- RETRIEVE FIRST ENTRY CONTENT --> 
     <xsl:element name="{preceding-sibling::entry/string[1]}"> 
     <xsl:value-of select="preceding-sibling::entry/string[2]"/> 
     </xsl:element> 
     <!-- APPLY GRANDCHILD LINKED HASH MAP --> 
     <linked-hash-map><xsl:apply-templates select="list/linked-hash-map"/></linked-hash-map> 
    </xsl:copy> 
    </xsl:template> 

    <!-- GENERALIZE FOR ALL DESCENDANT ENTRY NODES (W/O LINKED HASH MAP CHILD) --> 
    <xsl:template match="linked-hash-map">  
    <datarow> 
     <xsl:for-each select="descendant::entry[local-name(*[2])!='linked-hash-map']">   
      <xsl:element name="{string[1]}"> 
      <xsl:value-of select="normalize-space(string[2]|int)"/> 
      </xsl:element> 
     </xsl:for-each> 
     <!-- ADDED NODE (NOT PART OF ORIGINAL) --> 
     <readLink>https://api.cognitive.microsoft.com/api/v5/entities/b8ef6b82-02be-1e24-584c-f8283b7bdaeb</readLink> 
    </datarow>  
    </xsl:template> 

</xsl:stylesheet> 

出力

<?xml version="1.0" encoding="UTF-8"?> 
<linked-hash-map> 
    <entry> 
     <_type>News</_type> 
     <linked-hash-map> 
     <datarow> 
      <name>Virat Kohli</name> 
      <url>http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&amp;CID=09E4F1057ADB64720330FB2E7BC96547&amp;rd=1&amp;h=nw8K4uNRgs-nvsuz2GyXpqMxdRmzWK8Xbm3W_1IlO24&amp;v=1&amp;r=http%3a%2f%2fmovies.ndtv.com%2fbollywood%2fvirat-kohli-hearts-anushka-sharma-a-timeline-of-their-romance-1659877&amp;p=DevEx,5026.1</url> 
      <contentUrl>https://www.bing.com/th?id=ON.EE674002EC235BD5795D34695EABF504&amp;pid=News</contentUrl> 
      <width>640</width> 
      <description>On Wednesday, cricketer Virat Kohli</description> 
      <datePublished>2017-02-16T05:39:00</datePublished> 
      <category>Entertainment</category> 
      <readLink>https://api.cognitive.microsoft.com/api/v5/entities/b8ef6b82-02be-1e24-584c-f8283b7bdaeb</readLink> 
     </datarow> 
     <datarow> 
      <name>Shah Rukh Khan's TV show</name> 
      <url>http://www.bing.com/cr?IG=3DA864FA197A4D5DAD062780C15E3A16&amp;CID=09E4F1057ADB64720330FB2E7BC96547&amp;rd=1&amp;h=4CnQhOg9Nm7pmIu9OvDl6x9WtYtSuXblCSR_WQz1VoA&amp;v=1&amp;r=http%3a%2f%2fwww.hindustantimes.com%2ftv%2fshah-rukh-khan-s-tv-show-circus-is-back-on-small-screen%2fstory-OjQUQIWi6ogxj5eF1hivTI.html&amp;p=DevEx,5040.1</url> 
      <contentUrl>https://www.bing.com/th?id=ON.2974262BB8317FA4D4BCE4A61CA9488E&amp;pid=News</contentUrl> 
      <width>700</width> 
      <description>Here's some wonderful news</description> 
      <datePublished>2017-02-16T05:36:00</datePublished> 
      <category>Entertainment</category> 
      <readLink>https://api.cognitive.microsoft.com/api/v5/entities/b8ef6b82-02be-1e24-584c-f8283b7bdaeb</readLink> 
     </datarow> 
     </linked-hash-map> 
    </entry> 
</linked-hash-map> 
+0

HI Parfait、これは成功しました。しかし、私はJavaでxmlファイルを読んでいるときに問題が発生します。「1バイトのUTF-8シーケンスの無効なバイト1」というエラーが表示されます。 – user3187932

+0

どのxmlファイルですか?元のものか変形されたものか?私はXSLTをJava 1.8で実行しました(Apache Xalanと外部Saxon HEを使用しています)。あなたの情報源が私の情報と異なるかもしれません。私が言及したようにエンティティの問題に注意してください。 – Parfait

+0

こんにちはパルフェット、私は、XMLエンティティの参照がうまく処理されていることを確認しました。下のように私の名前と説明フィールドには文字が入っています。 バナヤイハ "親愛なる"友人 user3187932

関連する問題