Символ ')', шестнадцатеричное значение 0x29, не может быть включен в имя

Я столкнулся с проблемой, программно установив формулу для вычисляемого поля sharepoint, вот xml, который я генерирую:

<Field ID='3bc3a7ac-a5bc-49e0-b430-a987ddac42f7' Type='Calculated' Name='Comparison' StaticName='Comparison' DisplayName='Comparison' ResultType='Text' Required='TRUE' ReadOnly='TRUE'>
  <Formula>=IF(AND(CampoA>CampoB,CampoA<CampoC),&quot;OK&quot;,&quot;Not OK&quot;)</Formula>
  <FieldRefs>
    <FieldRef Name='CampoC'/>
    <FieldRef Name='CampoB'/>
    <FieldRef Name='CampoA'/>
  </FieldRefs>
</Field>

И это дает мне ошибку: символ ')', шестнадцатеричное значение 0x29, не может быть включен в имя. Должен ли я избегать скобок?


person OuterSpace    schedule 08.06.2017    source источник
comment
Вам нужно выйти из ‹ с помощью &lt;   -  person Daniel Haley    schedule 08.06.2017
comment
И > с &gt;   -  person Xorifelse    schedule 08.06.2017
comment
Убегать от › не обязательно, но не помешает.   -  person Daniel Haley    schedule 08.06.2017
comment
Я экранировал как ›, так и ‹, и теперь это дает мне ошибку {Произошла ошибка при разборе EntityName. Строка 1, позиция 186.}   -  person OuterSpace    schedule 08.06.2017
comment
Очень верно, но как он генерируется? Потому что, например, php имеет функцию html_entities(), а в python, например, у вас есть метод str.escape().   -  person Xorifelse    schedule 08.06.2017
comment
вот новый XML: ‹Идентификатор поля = '4cb963a4-35c8-4dd7-aa64-0c6e44a28e5f' Тип = 'Расчет' Имя = 'Сравнение' StaticName = 'Сравнение' DisplayName = 'Сравнение' ResultType = 'Текст' Обязательное = 'ИСТИНА ' ReadOnly='TRUE'›<Formula>=IF(AND(CampoA>CampoB,CampoA<CampoC),OK,Not OK)</Formula>‹FieldRefs› ‹FieldRef Name='CampoC'/› ‹FieldRef Name='CampoB'/› ‹FieldRef Name ='CampoA'/› ‹/FieldRefs› ‹/Field› Я использую код Csom   -  person OuterSpace    schedule 08.06.2017
comment
@OuterSpace Вы избегаете элементов xml: &lt/Formula&gt, чего вы не хотите делать. Делайте это только на значениях.   -  person Xorifelse    schedule 08.06.2017
comment
Я получил, но это совместная строка, я не могу разделить значение, вместо этого что-то не так со скобками? У меня была другая формула с › и ‹, и она работала без экранирования   -  person OuterSpace    schedule 08.06.2017
comment
Если бы у вас был < в вашем xml, он ожидал бы новый элемент, и поэтому очень важно избежать его. Я не понимаю, как это сработало бы изначально.   -  person Xorifelse    schedule 08.06.2017


Ответы (1)


Внутри элемента Formula вам нужно экранировать < с помощью &lt;...

<Field ID='3bc3a7ac-a5bc-49e0-b430-a987ddac42f7' Type='Calculated' Name='Comparison' StaticName='Comparison' DisplayName='Comparison' ResultType='Text' Required='TRUE' ReadOnly='TRUE'>
 <Formula>=IF(AND(CampoA>CampoB,CampoA&lt;CampoC),&quot;OK&quot;,&quot;Not OK&quot;)</Formula>
 <FieldRefs>
  <FieldRef Name='CampoC'/>
  <FieldRef Name='CampoB'/>
  <FieldRef Name='CampoA'/>
 </FieldRefs>
</Field>

Если бы у вас были буквальные символы &, вам также нужно было бы экранировать символы с &amp;.

Другой вариант - обернуть содержимое в CDATA...

<Field ID='3bc3a7ac-a5bc-49e0-b430-a987ddac42f7' Type='Calculated' Name='Comparison' StaticName='Comparison' DisplayName='Comparison' ResultType='Text' Required='TRUE' ReadOnly='TRUE'>
    <Formula><![CDATA[=IF(AND(CampoA>CampoB,CampoA<CampoC),&quot;OK&quot;,&quot;Not OK&quot;)]]></Formula>
    <FieldRefs>
        <FieldRef Name='CampoC'/>
        <FieldRef Name='CampoB'/>
        <FieldRef Name='CampoA'/>
    </FieldRefs>
</Field>

Я не уверен, что вы хотите использовать литерал &quot; в своей формуле. Если нет, измените их на " в разделе CDATA.

person Daniel Haley    schedule 08.06.2017
comment
‹Идентификатор поля='9380e3a5-e7fa-447e-9241-82611c0c5b27' Тип='Рассчитанный' Имя='Сравнение' StaticName='Сравнение' DisplayName='Сравнение' Тип результата='Текст' Обязательный='ИСТИНА' Только для чтения='ИСТИНА' ›‹Formula›=IF(AND(CampoA>CampoB,CampoA<CampoC),OK,Not OK)‹/Formula›‹FieldRefs›‹FieldRef Name='CampoC'/›‹FieldRef Name='CampoB'/›‹FieldRef Name='CampoA '/›‹/FieldRefs›‹/Field› Я экранировал содержимое, но выдает ошибку на позиции 209, где есть > - person OuterSpace; 08.06.2017
comment
@OuterSpace - это потому, что вы неправильно закрыли ссылку на объект с помощью ; (для gt и lt) - person Daniel Haley; 08.06.2017
comment
Безупречный, точный ответ, я бы не смог сделать это лучше. Но я запутался, первый набор кода индексируется с 1 пробелом, а второй - нет. Когда я редактировал, я столкнулся с проблемой, когда код исчезал. Вы тоже с таким сталкивались? - person Xorifelse; 08.06.2017
comment
@OuterSpace Тогда проголосуйте и отметьте это, это говорит достаточно спасибо. - person Xorifelse; 08.06.2017
comment
@Xorifelse - Спасибо! Я не заметил разницы в отступах кода. В первом наборе я просто скопировал/вставил/изменил вопрос. Во втором наборе я скопировал с oXygen, где дважды проверил свою работу. Пока перед кодом есть 4 пробела, он должен работать нормально. - person Daniel Haley; 08.06.2017