2011-12-29 1 views
1

WCF経由の配列からレポートを作成するAspx.Net Webページがあります。配列はXMLに変換され、翻訳を実行してhtmlレポートを取得します。.Net XMLシリアライズされた配列にはxmlnsの要素があり、それ以降のXSLT変換に失敗します

配列は、単純な文字列と数字を含むクラスです。

私はXMLを作成するために、アレイ上のシリアル化プロセスを使用しています:

XmlDocument xmlData = new XmlDocument(); 

// serialize the array so we can transform 
XmlSerializer slz = new XmlSerializer(typeof (ReportData[])); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    slz.Serialize(stream, responseMain); 
    stream.Position = 0; 
    xmlData.Load(stream); 
} 

XMLが生成されると、配列の要素内の各要素がのxmlns =「名前空間オブジェクトの」属性が含まれています

<?xml version="1.0"?> 
    <ArrayOfReportData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <GetPaymentOptionReportData> 
      <Name xmlns="http://mynamespace.ServiceContracts">SMITH, JAMES E    </Name> 
      <IdNumber xmlns="http://mynamespace.ServiceContracts">01081-01  </IdNumber> 
      <AcctDate xmlns="http://mynamespace.ServiceContracts">2011-09-19T00:00:00</AcctDate> 
      <NumberOfVisits xmlns="http://mynamespace.ServiceContracts">12</NumberOfVisits> 
      <Fee xmlns="http://mynamespace.ServiceContracts">329.00</Fee> 
     </GetPaymentOptionReportData> 
     </ArrayOfReportData> 

これにより、変換が失敗します。私は名前空間を設定していくつかのことを試みました(おそらく正しい方法ではないでしょう)。私が問題を解決するために見つけた唯一の方法は、シリアル化してトランスフォームの前に、問題のxmlns属性をすべて削除するために、データのinnerXmlでRegexを実行することでした(Ultrapicoのエクスプレッションのおかげで、日):!

/// <summary> 
/// Regular expression built for C# on: Thu, Dec 29, 2011, 08:14:26 AM 
/// Using Expresso Version: 3.0.3634, http://www.ultrapico.com 
/// 
/// A description of the regular expression: 
/// 
/// \s?xmlns\s?=\s?" 
///  Whitespace, zero or one repetitions 
///  xmlns 
///  Whitespace, zero or one repetitions 
///  = 
///  Whitespace, zero or one repetitions 
///  " 
/// [Protocol]: A named capture group. [\w+] 
///  Alphanumeric, one or more repetitions 
/// :\/\/ 
///  : 
///  Literal/
///  Literal/
/// [Domain]: A named capture group. [[\[email protected]][\w.:@]+] 
///  [\[email protected]][\w.:@]+ 
///   Any character in this class: [\[email protected]] 
///   Any character in this class: [\w.:@], one or more repetitions 
/// Literal /, zero or one repetitions 
/// Any character in this class: [\w\.?=%&=\[email protected]/$,], any number of repetitions 
/// " 
/// This regex captures the occurences of 
/// 
/// </summary> 
Regex xmlnsRegex = new Regex(
     "\\s?xmlns\\s?=\\s?\"(?<Protocol>\\w+):\\/\\/(?<Domain>[\\[email protected]]" + 
     "[\\w.:@]+)\\/?[\\w\\.?=%&=\\[email protected]/$,]*\"", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

// take out namespace attributes inside object elements 
xmlData.InnerXml = xmlnsRegex.Replace(xmlData.InnerXml, ""); 

これは、その場しのぎのように思えるので、私はいくつかのXMLの第一人者が、私にいくつかの援助を与えることができる期待していました。

+0

'ReportData'クラスの定義を投稿してください。また、派生型があると推定していますか?もしそうなら、 'GetPaymentOptionReportData'タイプを投稿してください。 –

+0

クラスは自動生成されるので、私はWCFサービスのコンシューマ側でクラスを変更しないことを望んでいます。それは困難です。ソースWebサービスを変更したり、自動生成されたクラスに属性を追加したりせずに、必要な追加でシリアライズする方法です。どちらも問題を解決することができますが、私の解決策の一部ではないクラスを開くことが必要です。もう1つは、インターフェイスが更新された場合、変更を再度適用する必要があります。その努力で、xmlを手作業で/反復的に作成できました。 私はコードを投稿できますが、例にそれを抽出する必要があります。おそらく今日はありません。感謝! ありがとう! –

+0

私は、クライアント側のクラスの変更については何も言いませんでした。 –

答えて

0

これらの名前空間のそれぞれをスタイルシートに登録するだけでよいでしょう。その後、

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:ns1="http://mynamespace.ServiceContracts" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

そして、彼らはこれらの接頭辞を使用するように、スタイルシートでXPath式と一致するパターンを書き換える:あなたはこのように、stylesheet要素でこれを行います。

+0

情報ありがとうございます。これは私が行かなければならない方法のように見えますが、私はそれをどのように実装するかについてはあまりよく分かりません。要素には名前空間が含まれており、要素名にはその接頭辞が含まれていないので、シリアライゼーションで何らかの形で「ns1:」という接頭辞を付けなければならないと推測しています。 ... がスタイルシートに指定されています。私は名前空間を追加することができますが、これまでに読んだドキュメントでは、各要素が独自の名前空間を持ち、親から継承していないと言われています。 –

+0

@RobbSadler - 1)どのプレフィックスを選択しても問題ありません。接頭辞は任意です。 XSLTでやっていることは、「この接頭辞を使ってこの名前空間の要素を参照したい」と言っているだけです。その後、XPathでその接頭辞を使用して要素を選択できます。ソースXMLの内容と一致する必要はありません。 2)名前空間は*祖先から継承されます。 –

関連する問題