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の第一人者が、私にいくつかの援助を与えることができる期待していました。
'ReportData'クラスの定義を投稿してください。また、派生型があると推定していますか?もしそうなら、 'GetPaymentOptionReportData'タイプを投稿してください。 –
クラスは自動生成されるので、私はWCFサービスのコンシューマ側でクラスを変更しないことを望んでいます。それは困難です。ソースWebサービスを変更したり、自動生成されたクラスに属性を追加したりせずに、必要な追加でシリアライズする方法です。どちらも問題を解決することができますが、私の解決策の一部ではないクラスを開くことが必要です。もう1つは、インターフェイスが更新された場合、変更を再度適用する必要があります。その努力で、xmlを手作業で/反復的に作成できました。 私はコードを投稿できますが、例にそれを抽出する必要があります。おそらく今日はありません。感謝! ありがとう! –
私は、クライアント側のクラスの変更については何も言いませんでした。 –