2017-08-15 22 views
0

我有以下XML和工作在SQL Server 2008中精細的查詢工作,但未能當我選擇與功能ConcatSubstring使用XmlDocument對象相同的節點C#。XPath函數不淨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我substring和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

魯斯蘭,你的建議工程..但我要的是使用評價爲XPath表達式的一部分,原生XPath函數(CONCAT,子在這種情況下)。想法是將所有xpaths存儲在數據庫中,並將源xml文檔中的值返回到另一個結構。你提出的方式需要重新解析xpath字符串,並且需要選擇函數中涉及的每個軸。你的建議讓我明白,不可能將本地函數與xmldocument對象一起使用。因此,我認爲我將使用XSLT來完成此操作。不管怎麼說,還是要謝謝你。 – TonyP

+0

@TonyP,對不起,我沒有正確理解你。我已經編輯我的答案 –

+1

太好了,正是我想要的,接受了答案 - 感謝 – TonyP