[英]Read CDATA from xml using LINQ not returning expected result
我正在嘗試使用LINQ在xml文件中讀取“查詢”元素值(定義為CDATA),但是,當我運行該應用程序時,將返回以下值:
System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement,System.String]
我對於獲得CDATA值缺少什么感到困惑。
XML文檔如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<dbprocedurestruct>
<variables id="vars">
<variable id="ooid">
<name>OrigOrgID</name>
<pseudo>Original Organization ID</pseudo>
<type>System.Int32</type>
<visible>true</visible>
</variable>
<variable id="noid">
<name>NewOrgID</name>
<pseudo>New Organization(s) ID</pseudo>
<type>System.Int32</type>
<visible>true</visible>
</variable>
<variable id="nssid">
<name>NewSysSubID</name>
<pseudo>New System Subscription ID</pseudo>
<type>System.Int32</type>
<visible>false</visible>
</variable>
</variables>
<scripts>
<script name="createscript">
<query>
<![CDATA[
SELECT
SystemSubscriptionID,
'INSERT INTO dbo.Subscriptions
(
SubscriptionID,
SystemSubscriptionTierID,
IsCustomized,
SubscriptionPrice,
DownloadPrice,
PlansPrice,
SpecsPrice,
SubscriptionStartDate,
SubscriptionDuration,
AutoRenewSubscription,
IsActive,
SubscriptionStatus,
CreatedBy,
CreatedOn,
LastEditBy,
LastEditOn)
VALUES (' +
CAST(SubscriptionID AS VARCHAR(50)) + ',' +
CAST(SystemSubscriptionTierID AS VARCHAR(50)) + ',' +
CAST(IsCustomized AS VARCHAR(50)) + ',' +
CAST(SubscriptionPrice AS VARCHAR(50)) + ',' +
CAST(DownloadPrice AS VARCHAR(50)) + ',' +
CAST(PlansPrice AS VARCHAR(50)) + ',' +
CAST(SpecsPrice AS VARCHAR(50)) + ',''' +
CAST(GetDate() AS VARCHAR(50)) + ''',' +
CAST(SubscriptionDuration AS VARCHAR(50)) + ',' +
CAST(AutoRenewSubscription AS VARCHAR(50)) + ',' +
CAST(IsActive AS VARCHAR(50)) + ',' +
CAST(SubscriptionStatus AS VARCHAR(50)) + ', 2, ''' +
CAST(GetDate() AS VARCHAR(50)) + ''', 2, ''' +
CAST(GetDate() AS VARCHAR(50)) + ''') '
FROM Subscriptions WHERE SystemSubscriptionID IN
(SELECT SystemSubscriptionID FROM SubscriptionMappings WHERE ReferenceID = {0});
SELECT IDENT_CURRENT('Subscriptions')
]]>
</query>
</script>
<script name="mappingscript">
<query>
<![CDATA[
INSERT INTO SubscriptionMappings
(SystemSubscriptionID,
ReferenceID,
SubscriptionTypeID,
SystemId,
IsActive,
CreatedBy)
SELECT
{0},
{1},
CAST(SubscriptionTypeID AS VARCHAR(50)),
2,
CAST(IsActive AS VARCHAR(50)),
2 FROM SubscriptionMappings
WHERE ReferenceID = {2}
AND
SystemSubscriptionID = {3}
]]>
</query>
</script>
</scripts>
</dbprocedurestruct>
這是我讀取xml文件的代碼片段:
SQLConnectivity _sc = new SQLConnectivity();
DataTable dt = new DataTable();
string xmlitem = (from scripts in xfile.Descendants("scripts") where scripts.Element("script").Value == "createscript" select scripts.Element("script").Element("query").Value).ToString();
//String tempquery = xmlitem.Elements("query").ToString();
String finalquery = String.Format(xmlitem, _ooid);
_sc.RunExecuteSQL(finalquery, ref dt);
return dt;
查詢的結果是IEnumerable
實例。 如果需要單個字符串結果,則需要使用FirstOrDefault
或SingleOrDefault
。 另外,搜索指定的“ createscript”元素時,需要使用“ name”屬性。
var sql = (from scripts in xfile.Root.Elements("scripts")
from script in scripts.Elements("script")
let name = script.Attribute("name")
where name != null && name.Value == "createscript"
from query in script.Elements("query")
select query.Value).FirstOrDefault();
編輯:可以使用string.Trim
和Regex.Replace
的組合從SQL剝離開頭和結尾的回車符和縮進。
var cleanSql = Regex.Replace(sql.Trim(), @"^\s+", "", RegexOptions.Multiline);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.