【问题标题】:Issue with LINQ inside XML Literals when generating XSD生成 XSD 时 XML Literals 中的 LINQ 问题
【发布时间】:2018-08-07 15:50:15
【问题描述】:

我正在根据this answer 在 XSD 中创建一个枚举。这是我的目标,供参考:

<xs:simpleType name="color" final="restriction" >
  <xs:restriction base="xs:string">
    <xs:enumeration value="green" />
    <xs:enumeration value="red" />
    <xs:enumeration value="blue" />
  </xs:restriction>
</xs:simpleType>
<xs:element name="SomeElement">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Color" type="color" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

枚举来自一个IEnumerable(Of String),我想从中直接生成一系列这些元素&lt;xs:enumeration value="value1" /&gt;

每当我运行我的代码时,它都会正确创建 xml,直到使用 LINQ,它开始转义 > 和 &gt; 和 &amp;lt;

输出:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="Instruments">
  <xs:simpleType name="InstrumentName" final="restriction">
    <xs:restriction base="xs:string">&lt;xs:enumeration value="AccuvimDL"/&gt;&lt;xs:enumeration value="AccuvimDLSignal"/&gt;&lt;xs:enumeration value="AlignmentFormBase" ...

我的代码:

Private Sub saveXsd(names As IEnumerable(Of String), typeName As String, typeType As String)
    Dim xsd = <?xml version="1.0" encoding="utf-8"?>
              <xs:schema id="Instruments" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
                  <xs:simpleType name=<%= typeType %> final="restriction">
                      <xs:restriction base="xs:string">
                          <%= From name In names
                              Select $"<xs:enumeration value=""{name}""/>" %>
                      </xs:restriction>
                  </xs:simpleType>
                  <xs:element name="SomeElement">
                      <xs:complexType>
                          <xs:sequence>
                              <xs:element name=<%= typeName %> type=<%= typeType %>/>
                          </xs:sequence>
                      </xs:complexType>
                  </xs:element>
              </xs:schema>
    xsd.Save("xsd.xsd")
End Function

我也尝试在 LINQ 部分使用这种语法

<%= From name In names Select <xs:enumeration value=<%= name %>/> %>

&lt;xs: 命名空间无法识别,因为它不再是 xml 文字的一部分并且无法编译。

我想知道这是否可行。我觉得VB.Net的xml文字特性很酷,希望能用上。

编辑:

写下这个问题一定让我脑子里有些东西松了。我找到了一个解决方案,但并不理想。

如果我添加命名空间,第二种 LINQ 方法将起作用

<%= From name In names 
    Select <xs:enumeration xmlns:xs="http://www.w3.org/2001/XMLSchema" value=<%= name %>/> %>

但是,我最终得到了每个元素中的命名空间。我想xsd没问题...

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="Instruments">
  <xs:simpleType name="InstrumentName" final="restriction">
    <xs:restriction base="xs:string">
      <xs:enumeration xmlns:xs="http://www.w3.org/2001/XMLSchema" value="AccuvimDL" />
      <xs:enumeration xmlns:xs="http://www.w3.org/2001/XMLSchema" value="AccuvimDLSignal" />
      <xs:enumeration xmlns:xs="http://www.w3.org/2001/XMLSchema" value="AlignmentFormBase" />
      ...

仍然欢迎其他建议

【问题讨论】:

  • 请将帖子标记为已回答,并用生成器技术剃须刀标记它?
  • @sprotty 它没有使用剃须刀。如果可能的话,仍然希望没有命名空间的解决方案。

标签: xml vb.net linq xsd xml-literals


【解决方案1】:

抱歉,我不熟悉 VB.Net XML 文字,所以我很感兴趣。

看起来你需要导入

Imports <xmlns:xs="http://www.w3.org/2001/XMLSchema">

Module Module1

    Sub Main()
        Dim xsd = <?xml version="1.0" encoding="utf-8"?>
                  <xs:schema id="Instruments" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
                      <xs:simpleType name=<%= "test" %> final="restriction">
                          <xs:restriction base="xs:string">
                              <%= From name In names
                                  Select <xs:enumeration value=" {name}"/> %>
                          </xs:restriction>
                      </xs:simpleType>
                  </xs:schema>
        xsd.Save("xsd.xsd")
    End Sub

End Module

【讨论】:

  • 太棒了!我不知道 Imports xml 命名空间。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多