2017-08-15 18 views
0

次のXMLと、SQL Server 2008でうまく動作するクエリがありますが、ConcatSubstringという同じノードを選択すると失敗します。XmlDocumentオブジェクトC#。XPath関数はnet framewokでは機能しませんが、SQLクエリで動作します

何が問題になりますか?

declare @x xml='<asn> 
     <asnH> 
     <senderId>9053357373T</senderId> 
     <pono>SCA0055792</pono> 
     <dino>440229</dino> 
     <shipmentWeight>1109</shipmentWeight> 
     <loadingQty>190</loadingQty>di 
     <zWeight>1109</zWeight> 
     </asnH> 
     <dd> 
     <COMNO>010</COMNO> 
     <T_x0024_ORNO>910055</T_x0024_ORNO> 
     <T_x0024_CFRW>UP1</T_x0024_CFRW> 
     <T_x0024_TRNO>abc-12345      </T_x0024_TRNO> 
     <T_x0024_DINO>440229</T_x0024_DINO> 
     <T_x0024_ITEM>  817025-001</T_x0024_ITEM> 
     <T_x0024_PONO>1</T_x0024_PONO> 
     <T_x0024_DDAT>2017-08-14T00:00:00-04:00</T_x0024_DDAT> 
     <T_x0024_DQUA>10</T_x0024_DQUA> 
     <T_x0024_OQUA>10</T_x0024_OQUA> 
     <T_x0024_WGHT>15</T_x0024_WGHT> 
     <T_x0024_CUPS>ea </T_x0024_CUPS> 
     <T_x0024_TRID>66085</T_x0024_TRID> 
     <lWeight>150</lWeight> 
     </dd> 
    </asn>' 

    select 
     t.c.query('concat(substring(asn[1]/asnH[1]/senderId[1],1,5),asn[1]/asnH[1]/dino[1])') 
    from 
     @x.nodes('.') t(c) 
+3

は、私はあなたが作業しているC#のコードを投稿するべきだと思います。 –

+0

私はXMLDocumentオブジェクトがジョブのためのツールだとは思わない。 https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx私は部分文字列とconcateは文字列メソッドです。 https://msdn.microsoft.com/en-us/library/hxthx5h6%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 ...しかし、私は.NET開発者ではないので間違い。 –

答えて

1

これは私が結果を与える:90533440229

string xml = @"<asn> 
    <asnH> 
    <senderId>9053357373T</senderId> 
    <pono>SCA0055792</pono> 
    <dino>440229</dino> 
    <shipmentWeight>1109</shipmentWeight> 
    <loadingQty>190</loadingQty>di 
    <zWeight>1109</zWeight> 
    </asnH> 
    <dd> 
    <COMNO>010</COMNO> 
    <T_x0024_ORNO>910055</T_x0024_ORNO> 
    <T_x0024_CFRW>UP1</T_x0024_CFRW> 
    <T_x0024_TRNO>abc-12345      </T_x0024_TRNO> 
    <T_x0024_DINO>440229</T_x0024_DINO> 
    <T_x0024_ITEM>  817025-001</T_x0024_ITEM> 
    <T_x0024_PONO>1</T_x0024_PONO> 
    <T_x0024_DDAT>2017-08-14T00:00:00-04:00</T_x0024_DDAT> 
    <T_x0024_DQUA>10</T_x0024_DQUA> 
    <T_x0024_OQUA>10</T_x0024_OQUA> 
    <T_x0024_WGHT>15</T_x0024_WGHT> 
    <T_x0024_CUPS>ea </T_x0024_CUPS> 
    <T_x0024_TRID>66085</T_x0024_TRID> 
    <lWeight>150</lWeight> 
    </dd> 
</asn>"; 

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.InnerXml = xml; 
XmlNode root = xmlDocument.DocumentElement; 
string xpath = "concat(substring(asn[1]/asnH[1]/senderId[1],1,5),asn[1]/asnH[1]/dino[1])"; 
string s = root.ParentNode.CreateNavigator().Evaluate(xpath).ToString(); 
Console.WriteLine(s); 
+0

Ruslan、あなたの提案は動作しますが、私が望むのは、xpath式の一部として評価されたネイティブxpath関数(この場合はconcat、substring)を使用することです。アイデアは、すべてのxpathをデータベースに格納し、ソースxmlドキュメントから別の構造に値を取得することです。あなたが登場する方法は、xpath文字列を再解析する必要があり、関数に関わる各軸を選択する必要があります。あなたの提案は、xmldocumentオブジェクトでネイティブ関数を使用することはできないことを理解してくれました。したがって、私はこれを行うためにXSLTを使用するつもりだと思います。とにかくありがとう。 – TonyP

+0

@TonyP、申し訳ありませんが、私はあなたを正しく理解していませんでした。私は私の答えを編集しました –

+1

グレート、まさに私が欲しかった、答えとして受け入れました - ありがとう – TonyP

関連する問題