Использование именованных простых типов с LINQ to XSD приводит к ошибке компилятора - PullRequest
3 голосов
/ 14 января 2011

У меня есть XSD, содержащий простой тип, подобный этому:

<xs:simpleType name="csharpName" id="csharpName">
    <xs:restriction base="xs:string">
        <xs:pattern value="[A-Za-z][A-Za-z0-9_]*" />
    </xs:restriction>
</xs:simpleType>

Теперь, когда я использую этот тип:

 <xs:element name="typeName" type="csharpName" />

LINQ to XSD генерирует

this.SetElementWithValidation(XName.Get("typeName", ""), value, "typeName", global::.csharpName.TypeDefinition);`

Обратите внимание на ::. после глобального. Теперь эта точка очень неправильная, я предполагаю, что мне не хватает пространства имен. Теперь, если я удаляю точку вручную, она работает вполне нормально, но я бы не стал удалять дюжину или около того вхождений в каждом поколении. У вас есть идеи?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

Я разобрался, для пользовательских типов нужны такие пространства имен:

<xs:schema
    attributeFormDefault="unqualified"
    elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://codegen"
    xmlns:codegen="http://codegen">

, а затем используйте типы с префиксом codegen.

2 голосов
/ 17 октября 2013

Хорошо, вот правильный ответ! (Я использую пакет nuget Linq2Xsd )

У оригинального решения спрашивающих есть большая проблема, и это то, что если вы добавляете свое собственное пространство имен во внешний XSD просто для предотвращения этой ошибки, то при попытке генерировать XML вы будете отправлять эту внешнюю службу готовой пространство имен они не могут распознать.

  • Начните с удаления любого созданного пространства имен и targetNamespace, которые вы, возможно, добавили.
  • Затем просто добавьте файл LINQ-TO-XSD-CONFIG.xsd в ваш проект. Это может быть где угодно.
  • Установить действие сборки на LinqToXsdConfiguration
  • NB: Файл можно вызывать как угодно, если он выполняет это действие сборки.

enter image description here

Содержимое этого файла должно быть списком всех пространств имен и отображений типов Clr. Помните, что каждая схема в DLL компилируется через один и тот же файл \obj\Debug\LinqToXsdSource.cs, поэтому вам нужно добавить каждое пространство имен для каждого XSD, который вы используете в своем проекте.

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

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="http://www.microsoft.com/xml/schema/linq">
  <Namespaces>
    <Namespace Schema="http://example.com/idr" Clr="example.com.idr"/>
    <Namespace Schema="" Clr="LinqXsdGenericNamespace"/>
  </Namespaces>
</Configuration>

Смотри также: http://linqtoxsd.codeplex.com/discussions/238570

2 голосов
/ 15 октября 2013

Пара вещей, которые я узнал за последние несколько ЧАСОВ об этом:

  • Как сказал @TDaver, пространство имен необходимо для избежания ::. в сгенерированном коде. Я надеялся, что смогу как-то переопределить это с помощью свойства Custom Tool Namespace, но это не сработало. Мне просто нужно было добавить готовое пространство имен к некоторым Amazon XSD, которые я использовал, и принять тот факт, что мне нужно будет сделать это снова, если XSD изменился.

  • Более ранние версии проекта Linq2XSD не имели этой проблемы, что-то изменилось - поэтому, если вы перекомпилируете, используя пакет nuget, в котором ранее вы использовали только загруженную DLL, то вы можете увидеть эту проблему там, где ее нет иметь его раньше.

  • Важно: ВСЕ XSD-файлы для проекта скомпилированы в один LinqToXsdSource.cs файл . Это очень важно понимать, поскольку вы, возможно, лаете не тот файл XSD, ища ошибку.

  • Вы можете следить за папкой obj \ Debug, в которой находится файл LinqToXsdSource.cs. Вы можете просто удалить эту папку, если у вас возникли проблемы, или оставить ее открытой, чтобы отслеживать ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...