none
XMLファイルに新たにタグを追加し、追加したタグで項目(データ)を囲う。

    質問

  • 前提・実現したい事
    ---
    ①PowerShellを使用し、SharePoint Online上のリストを、「XMLファイル」でローカルに保存する。
    (*プログラム作成済)

    【保存したXMLファイル】

    <!-- 元のXML -->
    <?xml version= "1.0"?>
    <catalog>
        <book id= "bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
        <publish_date>2000-10-01</publish_date>
        <description>An in-depth look at creating applicationswith XML.</description>
    </book>
    <book id= "bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-12-16</publish_date>
        <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description>
    </book>
    </catalog>


    ②保存したXMLファイルの中には、不要な項目(タグ)があるので、PowerShellを使い必要なタグのみ抽出。(別名で保存)

    (*プログラム作成済)

    【必要なタグのみ抽出したXMLファイル】抽出するタグ名 → title, genre, price

    <!-- 抜き出したXML -->
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>

    ③必要なタグのみ抽出したXMLファイルを開くと、必要な項目(タグ)のみ抽出されてはいるが、見づらいので
    1アイテム毎にタグでくくり、見やすくしたい。
    **(*プログラム作成中。不明点)**

    【この様なXMLファイルにしたい】

    <!-- 理想のXML.この様にしたい! -->
    <data>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
    </data>
    <data>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
    </data>

    ==========================================

    SampleのXMLファイルのコードを載せると、

    お客様の投稿にフラグが付けられ、現在、確認が行われています。

    誤ってフラグが付いたと思われる場合は、スレッドの ここ に投稿してください。」 

    とメッセージが表示され、細かく記載出来ません。

    10数回試しましたがダメでした。

    投稿不可にならない様、コード化せず文字だけの説明になっており申し訳ございません。

    ==========================================


    • 編集済み mie.8 2017年6月27日 4:22 修正.
    2017年6月27日 1:15

回答

  • 直接の回答ではありませんが…。

    ①から②を作った後に③を生成するのはちょっと手順がよろしくないように思います。

    というのも、②のフォーマットは、title,genre,priceが平坦に並んでいて、どこからどこまでが1レコードなのかという情報が消失しているからです。

    ①から直接③を生成するような手順に切り替えた方が、結局はシンプルなコードになるかと思います。

    ちなみにですが、②と③のフォーマットは、XML文書としては正しくないものとなります。そのため、後で何らかのプログラムにXML文書として読み込もうとするとエラーになります。XML文書にはルート要素(①の<catalog>に相当)が必要です。

    • 回答としてマーク mie.8 2017年6月27日 6:19
    2017年6月27日 3:08
    モデレータ

すべての返信

  • 直接の回答ではありませんが…。

    ①から②を作った後に③を生成するのはちょっと手順がよろしくないように思います。

    というのも、②のフォーマットは、title,genre,priceが平坦に並んでいて、どこからどこまでが1レコードなのかという情報が消失しているからです。

    ①から直接③を生成するような手順に切り替えた方が、結局はシンプルなコードになるかと思います。

    ちなみにですが、②と③のフォーマットは、XML文書としては正しくないものとなります。そのため、後で何らかのプログラムにXML文書として読み込もうとするとエラーになります。XML文書にはルート要素(①の<catalog>に相当)が必要です。

    • 回答としてマーク mie.8 2017年6月27日 6:19
    2017年6月27日 3:08
    モデレータ
  • ご回答ありがとうございます。

    分かり易く、ご説明頂きありがとうございます。

    もう一度考え直したいと思います。

    ありがとうございました。

    2017年6月27日 6:19
  • 牟田口大介さまが書かれた通り、xmlのルート要素は一つしか持てませんので元のcatalogを使い、本のidも残しておいたほうが使い勝手が良さそうなので、dataタグにいれてみました。

    $orgstr=@"
    <?xml version= "1.0"?>
    <catalog>
        <book id= "bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
        <publish_date>2000-10-01</publish_date>
        <description>An in-depth look at creating applicationswith XML.</description>
    </book>
    <book id= "bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-12-16</publish_date>
        <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description>
    </book>
    </catalog>
    "@
    $orgXml=[xml]$orgstr
    $newXml=[xml]'<?xml version= "1.0"?><catalog><dmy/></catalog>'
    $books=$orgXml.selectNodes('//book')
    $books|%{
        $id=$_.id
        $title=$_.title
        $genre=$_.genre
        $price=$_.price
        $data=$newXml.CreateElement("data")
        $data.setAttribute("id",$id)|out-null
        $newTitle=$newXml.CreateElement("title")
        $newGenre=$newXml.CreateElement("genre")
        $newPrice=$newXml.CreateElement("price")
        $newTitle.innerText=$title
        $newGenre.innerText=$genre
        $newPrice.innerText=$price
        @($newTitle,$newGenre,$newPrice)|%{
            $data.appendChild($_)|out-null
        }
        $newXml.Catalog.AppendChild($data)|out-null
    }
    $dmy=$newXml.selectSingleNode('//dmy')
    $dmy.parentNode.RemoveChild($dmy)|out-null
    
    $tmp=[system.io.path]::GetTempFileName()
    $newXml.save($tmp)
    gc $tmp
    rm $tmp

    できたxmlはこんな感じです

    <?xml version="1.0"?>
    <catalog>
      <data id="bk101">
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
      </data>
      <data id="bk102">
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
      </data>
    </catalog>
    


    • 編集済み ballville 2017年8月2日 17:34
    2017年8月2日 17:24
  • ご回答ありがとうございます。

    ご連絡遅れ、申し訳ございません。

    参考にさせて頂きます。

    ありがとうございました。

    2017年8月14日 4:06