@papa_iyaiya

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Visual Studio 2022   c# におけるXMLファイルの読取り方法について

Q&A

Closed

解決したいこと

Visual Studio 2022 の C# (Windows フォームアプリ)からアプリを作成しております。
XMLファイルの読み込みを行いたいのですが、
既存のファイルを正常に読み込むことが出来ません。
要素の指定の方法について教えてください。

発生している問題・エラー```

出ているエラーメッセージを入力

System.NullReferenceException: 'Object reference not set to an instance of an object.'
xElement が null でした。

読み込みを行いたいXMLファイル

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<hoge xmlns:m="http://www.example.com/hage" xmlns="http://www.example.com/hage2">
  <test>
   <test1>123</test1>
 </test>
</hoge>

現在のプログラム

  ~~~
   private const string xml_header = "hoge";
 ~ファイル選択とかの処理~
  XDocument xDocument = XDocument.Load(od.FileName);
   XElement xElement = xDocument.Element(xml_header);

自分で試したことここに問題・エラーに対して試したことを記載してください。

 ・XMLファイルの root要素を <hoge> だけにすると正常に読み込めました。
 ・「xml_header」に”hoge xmlns:m="http://www.example.com/hage" xmlns="http://www.example.com/hage2”を設定すると、xDocument.Elementで、スペースは取り扱えないとエラーが出ます。
 ・XMLファイルのフォーマットは変更できません。

要素の指定の方法が違っていると思っているのですが、指定の方法が判らず悩んでおります。
どうぞよろしくお願いいたします。

0 likes

2Answer

Comments

  1. その記事のどこに質問者が求める答えが書いてるのでしょうか?

  2. @papa_iyaiya

    Questioner

    Using Expanded Names とかそのあたりに記載がありました。
    ありがとうございます。

C++ ではなくて C# の話のように思われますが、何にせよ .NET のライブラリの XDcoument クラス、XElement クラスの話として回答します。

XDocument.Element メソッドの引数は String 型ではなくて XName 型です。

xDocument.Element("hoge") とすると、String 型の "hoge" からの暗黙の型変換を実行して XName を作成し、Element メソッドの引数に代入してくれますが、それには名前空間までは含まれません。

一方、質問の xml のコード、

<hoge xmlns:m="http://www.example.com/hage" xmlns="http://www.example.com/hage2">

には名前空間が指定されており、その XElement の XName は名前空間が含まれたものになります。

なので、

XElement xElement = xDocument.Element("hoge");

では XElement は取得できず null になります。

取得するには、以下の画像の 2 つめの赤線で示したように名前空間を含める必要があります。

debug.jpg

1Like

Comments

  1. @papa_iyaiya

    Questioner

    ありがとうございました。
    名前空間を含め指定することで無事にデータを取得することが出来ました。
    なお、ご指摘のとおりC#でした
    大変ありがとうございます。

  2. ご指摘のとおりC#でした

    質問文を書き直しておいてください

    問題が解決したならこのスレッドはクローズしてください。

Your answer might help someone💌