При пересечении произвольного использования графа объектов C# XPath/applying XSL преобразовывает

Вот самый простой метод:

public Long addIntegers(Integer a, Integer b) {
    return (long)a+b; 
}

Что происходит?

a и b неявно преобразуются в int в a+b. Поскольку результат a+b может быть больше максимального значения int (int = 32bit, long = 64bits), мы должны явно привести результат к long. Когда мы возвращаем long, он неявно преобразуется в Long из-за типа возвращаемого метода.

10
задан kemiller2002 16 December 2008 в 16:26
поделиться

3 ответа

Звуки, как будто проблема Вы пытаетесь решить, довольно интересны.

На первый взгляд я предложил бы писать Вашу собственную реализацию XPathNavigator потомок - существует только 20 с лишним методов для записи, и ни один из них не имеет особенно трудную подпись.

Наивная реализация с помощью некэшируемого отражения была бы медленной (выход), но будет работать хорошо подтверждением концепции, и Вы могли внести изменения для улучшения производительности, если бы/когда это стало проблемой.

Однако...

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

XML-файл является (по своей природе) простой иерархией элементов и атрибутов - нет никаких циклов (иначе циклы) в графике узла.

Выражение XPath может включать оператор"//"который широко означает искать на неограниченную глубину. (Для точного определения посмотрите раздел 2.5 из XPath 1.0.)

Если Вы применили такое выражение к графу объектов с перекрестными ссылками (иначе объектные циклы), то Вы рискуете средством анализа XPath, входящим в бесконечный цикл, поскольку это пыталось рекурсивно перечислить эффективно бесконечный график.

Вы можете работать вокруг этой проблемы, так или иначе отслеживая родительские узлы в Вашем XPathNavigator и выдача исключения, если цикл обнаруживается, но я не уверен, насколько жизнеспособный это будет.

2
ответ дан 4 December 2019 в 02:27
поделиться

Так как граф объектов может быть циклическим, Вы не можете возможно сделать Основанную на дереве структуру из него. Ваш лучший выбор состоит в том, чтобы представить граф объектов, он - самые простые компоненты: узлы и векторы.

Строго говоря, сделайте каждый узел (объект) элемент с уникальным идентификатором (возможно, обеспеченный GetHashCode C# () метод?). Ссылки на другие объекты (векторы) были бы обработаны путем ссылки на идентификатор объекта.

Классы в качестве примера (отмечают, что я не знаю C# так мой синтаксис, могут быть немного выключены):

public class SomeType {
   public int myInt  { get; set; }
}

public class AnotherType {
   public string myString { get; set; }
   public SomeType mySomeType { get; set; }
}

public class LastType {
   public SomeType mySomeType { get; set; }
   public AnotherType myAnotherType { get; set; }
}

public class UserTypes{
    static void Main()
    {
        LastType lt = new LastType();
        SomeType st = new SomeType();
        AnotherType atype = new AnotherType();

        st.myInt = 7;
        atype.myString = "BOB";
        atype.mySomeType = st;
        lt.mySomeType = st;
        lt.myAnotherType = atype;

        string xmlOutput = YourAwesomeFunction(lt);
    }
}

Затем мы ожидали бы, что значение xmlOutput будет чем-то вроде этого (обратите внимание, что выбранные Значения идентификаторов являются абсолютно синтетическими):

<ObjectMap>
 <LastType id="0">
   <mySomeType idref="1" />
   <myAnotherType idref="2" />
 </LastType>

 <SomeType id="1">
  <myInt>7</myInt>
 </SomeType>

 <AnotherType id="2">
  <myString>BOB</myString>
  <mySomeType idref="1" />
 </AnotherType>
</ObjectMap>
0
ответ дан 4 December 2019 в 02:27
поделиться

Есть (очень) старая статья MSDN под названием XPath Querying Over Objects with ObjectXPathNavigator , которая реализует аналогичный класс (также называемый ObjectXPathNavigator, что интересно). Я использовал это много лет назад для запроса некоторых данных из Visual SourceSafe и создания RSS-канала из журнала изменений, и это сработало достаточно хорошо. Однако я не использовал с ним XSLT, поэтому не уверен, работает это или нет. Также обратите внимание, что он был написан для Framework 1.0, поэтому вам может потребоваться обновить его для более поздних фреймворков. Кроме того, сейчас могут быть более эффективные способы сделать это, но это даст вам отправную точку (и статья хорошо объясняет, как это работает).

6
ответ дан 4 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

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