2017-02-22 12 views
0

私はコンピュータ診断セッションからかなり大きなXMLファイルを持っています。私の目標は、テスト結果データを取得し、それを顧客のためにPDFにポンピングすることです。 XMLに関する経験はほとんどありませんが、これは大きな問題になります。ここで XMLでカスタムネームスペースで子ノードを取得する

は、文書のサンプルです:

<pcd:DiagLog xmlns="http://www.pc-doctor.com/2004/8/diagLogger" 
      xmlns:pcd="http://www.pc-doctor.com/2004/8/diagLogger" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.pc-doctor.com/2004/8/diagLogger 
      http://www.pc-doctor.com/2004/8/diagLogger/diagLogger.xsd"> 
    <Application> 
     <version>6.0.6818.10</version> 
     <Start> 
      <Time hour="04" minute="14" second="01" millisecond="34" month="10" day="15" year="2016" utcOffset="-480">2016-10-15T04:14:01.034-08:00</Time> 
     </Start> 
     <OS>Windows 10 Service Pack 0 PE x86 32-bit</OS> 
    </Application> 
     ....... 
    <DiagInfo> 
     .... 
     <TestResult EnglishResult="PASS"> 
       .... 
     </TestResult> 
    </DiagInfo> 

あり</Application><DiagInfo>の間に数千行がありますが、私は<DiagInfo><TestResult>で見つかった情報を持つ唯一の心配です。

私は単にによってノードをつかむことができると思った:

XmlDocument doc = new XmlDocument(); 
    doc.Load(xmlFilePath); 
    XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
    manager.AddNamespace("pcd", "http://www.pc-doctor.com/2004/8/diagLogger"); 
    XmlNodeList xnList = doc.SelectNodes("/pcd:DiagLog/DiagInfo", manager); 

しかし、これは空のリストを返しています。私がNamespace Manager or XsltContext neededを参照すると、が表示されます私はそれを正しくやっていますが、私は正しく名前空間を追加することを理解しているとは思いません。ルート要素を<pcd:DiagLog>の代わりに<Diagnostics></Diagnostics>に変更し、試してみます:doc.SelectNodes("/Diagnostics/DiagInfo", manager);自分のノードリストに値が設定されています。

名前空間がどこにあるのか誰にでも分かりますか?

+0

@Tomalakこれはコピー/貼り付けのエラーです。コードとURIが一致していることを確認しました。 –

答えて

1

その名前空間内のすべてのノードに名前空間接頭辞を使用する必要があります。

これは間違っています:/pcd:DiagLog/DiagInfo

これは正しいです:/pcd:DiagLog/pcd:DiagInfo

+0

Yup。それはそれだった。私は答えとしてまだマークすることはできませんが、それは働いた。 –

+1

デフォルトの名前空間が伝播します。明示的な名前空間はありません。 XMLはデフォルトの名前空間を使用します。厳密に言えば、入力XMLのノードに 'pcd'という接頭辞を使用していない場合、悪影響を与えずに名前空間宣言をスローすることができます。 C#でその名前空間 'pcd'を呼び出す必要もありません。あなたが望む任意のハンドルを与えることができ、URIだけが一致する必要があります。 – Tomalak

関連する問題