Как определить нумерованный тип данных в xml-схеме? [Дубликат]

Просто использовал превосходный ответ jiln сверху, но ему нужно было расширить, чтобы разделить несколько столбцов. Думаю, я бы поделился.

def splitDataFrameList(df,target_column,separator):
''' df = dataframe to split,
target_column = the column containing the values to split
separator = the symbol used to perform the split

returns: a dataframe with each entry for the target column separated, with each element moved into a new row. 
The values in the other columns are duplicated across the newly divided rows.
'''
def splitListToRows(row, row_accumulator, target_columns, separator):
    split_rows = []
    for target_column in target_columns:
        split_rows.append(row[target_column].split(separator))
    # Seperate for multiple columns
    for i in range(len(split_rows[0])):
        new_row = row.to_dict()
        for j in range(len(split_rows)):
            new_row[target_columns[j]] = split_rows[j][i]
        row_accumulator.append(new_row)
new_rows = []
df.apply(splitListToRows,axis=1,args = (new_rows,target_column,separator))
new_df = pd.DataFrame(new_rows)
return new_df
77
задан Luke 19 January 2012 в 15:13
поделиться

4 ответа

Числовое значение, по-видимому, отсутствует в определении цены. Попробуйте следующее:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>
106
ответ дан user998692 26 August 2018 в 05:47
поделиться

вам нужно создать тип и сделать атрибут этого типа:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

, затем:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>
7
ответ дан A.B.Cade 26 August 2018 в 05:47
поделиться

Новый ответ на старый вопрос

Ни один из существующих ответов на этот старый вопрос не касается реальной проблемы.

Реальная проблема заключалось в том, что xs:complexType не может напрямую иметь xs:extension в качестве дочернего элемента в XSD. Исправление состоит в том, чтобы сначала использовать xs:simpleContent. Подробности следуют ...


Ваш XML,

<price currency="euros">20000.00</price>

будет действителен против либо следующих исправленных XSD:

Локально определенный тип атрибута

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Тип атрибута, определенный глобально

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Примечания

  • Поскольку комментируется @Paul , они меняют тип содержимого price с xs:string на xs:decimal, но это не является строго необходимым и не является реальной проблемой.
  • Так как ответил @ user998692 , вы можете выделить определение валюты, и вы можете перейти на xs:decimal, но это тоже не было настоящей проблемой.

Реальная проблема заключалась в том, что xs:complexType не может напрямую иметь xs:extension в качестве ребенка в XSD; xs:simpleContent необходим.

Связанный вопрос (который не был задан, но, возможно, путал другие ответы):

Как можно price быть ограничено, учитывая, что у него есть атрибут?

В этом случае потребуется отдельное глобальное определение priceType; это невозможно сделать только с определениями локального типа.

Как ограничить содержимое элемента, когда элемент имеет атрибут

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>
15
ответ дан Community 26 August 2018 в 05:47
поделиться
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

Это полностью исключает необходимость перечисления. При необходимости вы можете изменить тип, чтобы удвоить.

-1
ответ дан Nachiket Kulkarni 26 August 2018 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: