代码之家  ›  专栏  ›  技术社区  ›  djv

生成XSD时,XML文本中的LINQ出现问题

  •  1
  • djv  · 技术社区  · 7 年前

    我正在根据 this answer . 这就是我的目标,作为参考:

    <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) 我想直接从中产生一系列的元素 <xs:enumeration value="value1" />

    每当我运行代码时,它都会正确地创建xml,直到使用LINQ时,它才开始转义>和<为 &gt; &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 %>/> %>
    

    但是 <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" />
          ...
    

    仍对其他建议持开放态度

    1 回复  |  直到 7 年前
        1
  •  1
  •   djv    7 年前

    抱歉,我不熟悉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