C# 分解XML并显示在SSRS报告中

C# 分解XML并显示在SSRS报告中,c#,sql,xml,reporting-services,sql-server-2014,C#,Sql,Xml,Reporting Services,Sql Server 2014,我有这样的XML <OrchestrationConfiguration> <Instrument> <Spectrometer> <Inputs> <Channel-ChannelNumber-1> <ChannelNumber>1</ChannelNumber> <ChannelName>Answer01</ChannelName>

我有这样的XML

<OrchestrationConfiguration>
<Instrument>
<Spectrometer>
    <Inputs>
      <Channel-ChannelNumber-1>
        <ChannelNumber>1</ChannelNumber>
        <ChannelName>Answer01</ChannelName>
      </Channel-ChannelNumber-1>
    </Inputs>
    <Outputs>
      <Channel-ChannelNumber-1>
        <ChannelNumber>1</ChannelNumber>
        <ChannelName>1</ChannelName>
        <ChannelName>2</ChannelName>
        <ChannelName>3</ChannelName>
        <ChannelName>4</ChannelName>
        <ChannelName>5</ChannelName>
        <ChannelName>6</ChannelName>
        <ChannelName>7</ChannelName>
        <ChannelName>8</ChannelName>
        <ChannelName>9</ChannelName>
        <ChannelName>10</ChannelName>
      </Channel-ChannelNumber-1>
      <Channel-ChannelNumber-2>
      <ChannelNumber>2</ChannelNumber>
      <ChannelName>Temperature-K</ChannelName>
      </Channel-ChannelNumber-2>
      <Channel-ChannelNumber-3>
        <ChannelNumber>3</ChannelNumber>
        <ChannelName>Pressure-inHg-absolute</ChannelName>
        </Channel-ChannelNumber-3>
    </Outputs>
</Spectrometer>
</OrchestrationConfiguration>

1.
答复01
1.
1.
2.
3.
4.
5.
6.
7.
8.
9
10
2.
温度-K
3.
绝对压力
在我的SSRS报告中。我创建了一个按父名称分组的列表,为了获得输出,我应用了以下过滤器

我面临的问题是获取输入。我无法区分输出和输入,因为过滤器是相同的。还有别的方法吗?如果需要,我很乐意更改XML的格式。

我正在使用XMLTable函数分解xml

可能有用的注释
  • 我正在使用SQL Server 2014
  • 上面的XML以SQL的形式存在于数据库表中

  • 在注释中,您声明可以更改XML。你真的应该这样做

    一些背景:

    • XML中节点的顺序是持久化的。只要“位置”与节点顺序中的实际位置相同,就无需说明。尽管如此,逐字说明ChannelNumber仍然是一个好主意,因为它可以简化查询
    • 要求XML*显示
      下面的所有
      元素很容易,但要求显示
      下面的所有元素需要一些复杂的解决方法,这些元素的名称以
      频道
      开头
    试着这样做:

    DECLARE @XML XML=
    '<OrchestrationConfiguration>
      <Instrument>
        <Spectrometer>
          <Inputs>
            <Channel Number="1">
              <ChannelName>Answer01</ChannelName>
            </Channel>
          </Inputs>
          <Outputs>
            <Channel Number="1">
              <ChannelName>1</ChannelName>
              <ChannelName>2</ChannelName>
              <ChannelName>3</ChannelName>
              <ChannelName>4</ChannelName>
              <ChannelName>5</ChannelName>
              <ChannelName>6</ChannelName>
              <ChannelName>7</ChannelName>
              <ChannelName>8</ChannelName>
              <ChannelName>9</ChannelName>
              <ChannelName>10</ChannelName>
            </Channel>
            <Channel Number="2">
              <ChannelName>Temperature-K</ChannelName>
            </Channel>
            <Channel Number="3">
              <ChannelName>Pressure-inHg-absolute</ChannelName>
            </Channel>
          </Outputs>
        </Spectrometer>
      </Instrument>
    </OrchestrationConfiguration>';
    
    SELECT InpCh.value('@Number','int') AS InputChannelNumber
          ,InpCh.value('(ChannelName/text())[1]','nvarchar(max)') AS InputChannelName
          ,OutCh.value('@Number','int') AS InputChannelNumber
          ,OutChName.value('(text())[1]','nvarchar(max)') AS InputChannelName
    FROM @xml.nodes('/OrchestrationConfiguration/Instrument/Spectrometer/Inputs/Channel') AS A(InpCh)
    OUTER APPLY @xml.nodes('/OrchestrationConfiguration/Instrument/Spectrometer/Outputs/Channel') AS B(OutCh)
    OUTER APPLY B.OutCh.nodes('ChannelName') AS C(OutChName)
    

    在注释中,您声明可以更改XML。你真的应该这样做

    一些背景:

    • XML中节点的顺序是持久化的。只要“位置”与节点顺序中的实际位置相同,就无需说明。尽管如此,逐字说明ChannelNumber仍然是一个好主意,因为它可以简化查询
    • 要求XML*显示
      下面的所有
      元素很容易,但要求显示
      下面的所有元素需要一些复杂的解决方法,这些元素的名称以
      频道
      开头
    试着这样做:

    DECLARE @XML XML=
    '<OrchestrationConfiguration>
      <Instrument>
        <Spectrometer>
          <Inputs>
            <Channel Number="1">
              <ChannelName>Answer01</ChannelName>
            </Channel>
          </Inputs>
          <Outputs>
            <Channel Number="1">
              <ChannelName>1</ChannelName>
              <ChannelName>2</ChannelName>
              <ChannelName>3</ChannelName>
              <ChannelName>4</ChannelName>
              <ChannelName>5</ChannelName>
              <ChannelName>6</ChannelName>
              <ChannelName>7</ChannelName>
              <ChannelName>8</ChannelName>
              <ChannelName>9</ChannelName>
              <ChannelName>10</ChannelName>
            </Channel>
            <Channel Number="2">
              <ChannelName>Temperature-K</ChannelName>
            </Channel>
            <Channel Number="3">
              <ChannelName>Pressure-inHg-absolute</ChannelName>
            </Channel>
          </Outputs>
        </Spectrometer>
      </Instrument>
    </OrchestrationConfiguration>';
    
    SELECT InpCh.value('@Number','int') AS InputChannelNumber
          ,InpCh.value('(ChannelName/text())[1]','nvarchar(max)') AS InputChannelName
          ,OutCh.value('@Number','int') AS InputChannelNumber
          ,OutChName.value('(text())[1]','nvarchar(max)') AS InputChannelName
    FROM @xml.nodes('/OrchestrationConfiguration/Instrument/Spectrometer/Inputs/Channel') AS A(InpCh)
    OUTER APPLY @xml.nodes('/OrchestrationConfiguration/Instrument/Spectrometer/Outputs/Channel') AS B(OutCh)
    OUTER APPLY B.OutCh.nodes('ChannelName') AS C(OutChName)
    

    这个XML的构造在您的控制之下吗?您应该避免像在
    中那样为元素命名编号。而是使用像
    这样的属性。否则您将遇到严重的问题……是的,XML可以更改。必须对所有仪表(仪表块)进行更换。哦,谢谢你,什么样的问题?这个XML的构造在你的控制之下吗?您应该避免像在
    中那样为元素命名编号。而是使用像
    这样的属性。否则您将遇到严重的问题……是的,XML可以更改。必须对所有仪表(仪表块)进行更换。哦,谢谢,什么问题?