2013-12-03 3 views
0

«2147483647» Максимальное значение, которое может обрабатывать maxOccurs? Какое максимальное значение может обрабатывать maxOccurs? Установка значения MaxOccurs в неограниченной может привести к истощению ресурсов и в конечном счете к отказу в обслуживанииКаково максимальное целое число maxOccurs в XML-схеме XSD?

Вот пример XSD с MaxOccurs установленным, что я думаю, что это максимальное значение, которое MaxOccurs может работать, пожалуйста, проверьте:

mySchema.xsd

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

<xs:element name="family"> 
    <xs:complexType> 
     <xs:choice maxOccurs="unbounded"> 
      <xs:element name="person" maxOccurs="2147483647"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="name" type="xs:string"/> 
         <xs:element name="firstname" type="xs:string"/> 
         <xs:element name="age" type="xs:int"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="address" type="xs:string" minOccurs="1"/> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 

+0

Почему бы просто не сделать его неограниченным, а не произвольным большим числом? – rmlan

+0

Возможный дубликат [W3C XML Schema и максимальное целое число для maxOccurs] (http://stackoverflow.com/questions/300196/w3c-xml-schema-and-the-maximum-integer-for-maxoccurs) –

+0

Установка maxOccurs ценность для неограниченного может привести к исчерпанию ресурсов и, в конечном счете, к отказу в обслуживании. Я просто хочу знать максимальное значение, которое я мог бы использовать для этого тега. @rmlan – javaPlease42

ответ

2

Из спецификации, ответ нет: нет предела. Ниже приведены фрагменты из the spec (ссылок на XSD 1.0):

maxOccurs = (nonNegativeInteger | unbounded) : 1

Для nonNegativeInteger, "О · Значения пространства · из nonNegativeInteger есть бесконечное множество {0,1,2, ...}."

поскольку никаких ограничений нет, практически не существует, каждая реализация устанавливает свою собственную ...

ли это «какой-то Microsoft библиотеки», как кто-то комментировал ранее, или Java, как это кажется в вашем случае, или XML устройство , лимиты могут быть четко определены (как в случае Microsoft) или напуганы для понимания или управления d извне через политики, связанные с вашим процессором XML (наиболее заметно в устройствах XML).

Например, максимальное значение, которое Xerces может возвращать для числового maxOccurs, ограничено тем, что int означает в Java, которое равно 2^31-1. Если вы поместите 2^31 как maxOccurs в свой XSD, некоторые могут сказать, что Xerces не будет вести себя должным образом ... Я считаю, что он переворачивается до неограниченного ...

Я точно знаю, что установка больших чисел на maxOccurs, в попытка предотвратить DoS может фактически иметь противоположный эффект (см. this post) ...

+0

ОК, поэтому возможно _maxOccurs = "1000" _ будет резонируемым и не приведет к каким-либо проблемам с производительностью. Как вы думаете, это самое высокое значение, которое maxOccurs можно установить на ** без **, вызывая проблемы с производительностью или стабильностью. @Petru Gardea – javaPlease42

+1

@ javaPlease42, моя собственная практика основана на использовании числа, которое твердо или разумно управляется областью, на которую я нацеливаюсь, или неограничен. Я не играю между ними; развертывания, с которыми я связан, полагаются на политики, установленные на уровне инфраструктуры; чтобы дать вам представление ... взгляните на [это] (http://pic.dhe.ibm.com/infocenter/wsdatap/v3r8m1/index.jsp?topic=%2Fxi50%2Fwsproxy_settingparserlimits_task.htm). –

1

Как уже отмечал Петру Гардеа, 2147483647 не является наивысшим юридическим значением для maxOccurs по той простой причине, что там не является высшей юридической ценностью. Схема для документов схемы в спецификации XSD объявляет maxOccurs с типом объединения xsd: nonNegativeInteger и токеном «unbounded», а xsd: nonNegativeInteger в конечном счете является подтипом xsd: decimal. Правила минимальных пределов реализации требуют, чтобы все реализации поддерживали все десятичные значения, которые могут быть записаны шестнадцатью значащими десятичными цифрами. Таким образом, наибольшее значение, которое гарантировано будет принято всеми соответствующими реализациями XSD, - это, я думаю, 9999999999999999.

Задание числового значения maxOccurs требует, чтобы валидатор отслеживал, сколько именно элементов он видел, что делает более крупный конечный автомат (и, таким образом, является контрпродуктивным, если ваша цель - ограничить использование ресурсов).

Более надежный способ предотвращения истощения ресурсов должен состоять в том, чтобы запустить валидатор в процессе, который имеет ограничения по времени и/или памяти. Практически каждая операционная система, написанная за последние 50 лет, имеет возможность налагать такие ограничения, и некоторые синтаксические анализаторы XML (например, rxp) имеют параметры времени выполнения для той же цели. Есть ли причина, по которой вы хотите разместить свои ограничения ресурсов в схеме вместо использования ограничений операционной системы для процесса синтаксического анализа?

Смежные вопросы