0

考虑到 nvarchar(max) 中的单元格是两个标签之间的数字,你能告诉我如何不仅正确地解析 XML,而且还能很好地解析 XML 吗?

示例(XML):

<SignedLicenseInfo> <LicenseInfo> <ExpirationDate> 9223372036854775807 </ ExpirationDate> <AvailiableModules> 30 </ AvailiableModules> <PagesLimit> 708,976 </ PagesLimit> <PagesLimitRenewDate> 132274944000000000 </ PagesLimitRenewDate> <IsDefaultLicense> true </ IsDefaultLicense> <CustomModuleAuthorId> </ CustomModuleAuthorId> <IsCountRecognizedPagesOnly> false </ IsCountRecognizedPagesOnly> <IsCyrillicLanguageEnabled> true </ IsCyrillicLanguageEnabled> <MaximumNumberOfTemplateFields> 2147483647 </ MaximumNumberOfTemplateFields> <Type> 11 </ Type> <Amount> 0 </ Amount> </ StationInfo > </ LicenseStationInfo> <CustomFeatures> </ CustomFeatures> <LocalExpirationDate> 132271122849228006 </ LocalExpirationDate> </ LicenseInfo> <Signature> XXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXdfsd </ Signature> </ SignedLicenseInfo>

您需要获取 (708976) 中的内容。我在数据库中得到以下查询:

SELECT substring (s.Value, CHARINDEX ('<PagesLimit>', s.Value) +12, CHARINDEX ('</PagesLimit>', s.Value, CHARINDEX ('<PagesLimit>', s.Value) +12) - CHARINDEX ('<PagesLimit>', s.Value) -12) as My_String
from dbo.Settings s

如何使它更简洁和合乎逻辑?而不是通过选择来回的字符数。谢谢。

4

2 回答 2

1

您的 XML 格式不正确...我不得不删除一些空白,并且有两个结束标记,它们缺少开始标记(找到它们已注释)。

XML 不能被解析为带有一些花哨附加功能的字符串。有一些使用 XQuery 和 XPath 的原生 XML 方法。

尝试这个:

DECLARE @xml XML=
N'<SignedLicenseInfo>
  <LicenseInfo>
    <ExpirationDate> 9223372036854775807 </ExpirationDate>
    <AvailiableModules> 30 </AvailiableModules>
    <PagesLimit> 708,976 </PagesLimit>
    <PagesLimitRenewDate> 132274944000000000 </PagesLimitRenewDate>
    <IsDefaultLicense> true </IsDefaultLicense>
    <CustomModuleAuthorId />
    <IsCountRecognizedPagesOnly> false </IsCountRecognizedPagesOnly>
    <IsCyrillicLanguageEnabled> true </IsCyrillicLanguageEnabled>
    <MaximumNumberOfTemplateFields> 2147483647 </MaximumNumberOfTemplateFields>
    <Type> 11 </Type>
    <Amount> 0 </Amount>
    <!-- /StationInfo -->
    <!-- /LicenseStationInfo -->
    <CustomFeatures />
    <LocalExpirationDate> 132271122849228006 </LocalExpirationDate>
  </LicenseInfo>
  <Signature> XXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXdfsd </Signature>
</SignedLicenseInfo>';

SELECT @xml.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit/text())[1]','varchar(max)');

这返回708,976

于 2020-02-25T16:18:45.917 回答
0

谢谢大家。使用提供的信息,我这样做了:

declare @xml xml;
SELECT @xml = s.Value from dbo.Settings s where s.Name='LicenseString';
select @xml.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit)[1]', 'int');
于 2020-02-26T08:39:35.127 回答