我需要从XML分组"Document"值.问题是因为键值(productType)可以是多个.
这是XML:
<Documents>
<Document>
<id>1</id>
<title>title1</title>
<productTypes>
<productType id="x1">Capital Costs Analysis Forum - Brazil</productType>
<productType id="x3">Environmental, Health and Safety & Sustainability</productType>
</productTypes>
</Document>
<Document>
<id>2</id>
<title>title2</title>
<productTypes>
<productType id="x1">Capital Costs Analysis Forum - Brazil</productType>
</productTypes>
</Document>
<Document>
<id>3</id>
<title>title3</title>
<productTypes>
<productType id="x3">Environmental, Health and Safety & Sustainability</productType>
</productTypes>
</Document>
<Document>
<id>4</id>
<title>title4</title>
<productTypes>
<productType id="x2">Defense, Risk & Security</productType>
</productTypes>
</Document>
Run Code Online (Sandbox Code Playgroud)
这就是我尝试的:
var documents = from document in some.Descendants("Document")
group document by (string)document
.Element("productTypes")
.Elements("productType")
.First() into docGroup
select docGroup;
Run Code Online (Sandbox Code Playgroud)
只有有一个productType元素,我的代码才有效.如果productType有多个值,如何更改我的代码?
我在Core Service(SDL Tridion 2011 SP1)上使用GetSystemWideList操作时尝试为PublishTransactionState应用过滤器.
如果我尝试设置过滤器值,如PublishTransactionState.ScheduledForPublish或PublishTransactionState.WaitingForPublish,我得不到任何结果,即使我确定在队列中有这种状态的发布事务.
var filter = new PublishTransactionsFilterData {ForRepository = new LinkToRepositoryData {IdRef = "tcm:0-69-1"}};
filter.PublicationTarget = new LinkToPublicationTargetData { IdRef = "tcm:0-1-65537" };
filter.PublishTransactionState = PublishTransactionState.ScheduledForPublish;
//filter.StartDate = DateTime.Today.AddDays(-1);
var transactions = coreServiceSession.GetSystemWideList(filter);
Console.WriteLine(transactions.Count() + " publish transactions");
Run Code Online (Sandbox Code Playgroud)
启用filter.PublishTransactionState行后,核心服务始终返回0结果.通过此行注释,我们将按预期获取发布事务列表,其中包括一些状态为SceduledForPublish的事务.
其他过滤器,如StartDate过滤器按预期工作.
有人这个有用吗?
我正在生成Tridion二进制链接,如下所示:
输出将作为输出类型REL的动态组件模板发布.发布目标指定ASP.NET.
我在代理数据库的COMPONENT_PRESENTATIONS表中看到的内容输出如下:
<tcdl:Link type="binary" origin="tcm:0-0-0"
destination="tcm:34-669" templateURI="tcm:0-0-0"
linkAttributes="" textOnFail="true" addAnchor=""
variantId="">Document2</tcdl:Link>
Run Code Online (Sandbox Code Playgroud)
所以你至少可以看到文字"Document2"
如果我手工制作二进制链接控件,<tridion:BinaryLink..../>这可以正常工作,但是上面列出的TCDL没有产生可见的输出.
可能出了什么问题?我接下来应该调查什么?
我有一个.net正则表达式,我正在使用Windows Powershell进行测试.输出如下:
> [System.Text.RegularExpressions.Regex]::Match("aaa aaa bbb", "aaa.*?bbb")
Groups : {aaa aaa bbb}
Success : True
Captures : {aaa aaa bbb}
Index : 0
Length : 11
Value : aaa aaa bbb
Run Code Online (Sandbox Code Playgroud)
我的期望是使用?量词会导致匹配aaa bbb,因为第二组的a足以满足表达式.我对非贪婪量词的理解是否有缺陷,或者我测试不正确?
SED流编辑器是否有.NET端口?理想情况下,它将是开源的,但是在此阶段,我不排除任何问题。
我已经用谷歌搜索了这个,没有任何明显的成功,所以这里的第二个问题是:创建一个要困难多少?
我假设SED的来源在C中。如果我的主要问题的答案是“否”,那么将此类项目移植到C#的指针/策略将不胜感激。
我们正在尝试映射一个对象 - 一个Tridion Outbound Email Contact - 它有一个带有内部构造函数的自定义字典类型属性 - ExtendedDetailCollection
从对象到Viewmodel的精细映射
Mapper.CreateMap<Contact,ContactViewModel>()
.ForMember(x=>x.Name, m=>m.MapFrom(x=>x.ExtendedDetails["Name"].StringValue))
Run Code Online (Sandbox Code Playgroud)
但另一种方式不起作用
我们尝试过:
Mapper.CreateMap<ContactViewModel,Contact>()
.ForMember(x=>x.ExtendedDetails["Name"].Value, m => m.MapFrom(x=>x.Name));
Run Code Online (Sandbox Code Playgroud)
但是会引发运行时异常.
编辑:异常的消息是:
AutoMapper.AutoMapperConfigurationException:仅对类型上的顶级单个成员支持成员的自定义配置.
我们还尝试了各种类型的转换器和值解析器,但是没有一个允许我们获取被映射到的对象,这是我们需要访问以映射ExtendedDetails对象.
Mapper.CreateMap<ContactViewModel,Contact>()
.ForMember(x=>x.ExtendedDetails, m => ????);
Run Code Online (Sandbox Code Playgroud)
是否有这样的模式或使用静态方法更容易?
在Tridion Explorer中打开各种弹出窗口时,消息中心会显示以下消息:
Couldn't retrieve data from 1 datasources
Run Code Online (Sandbox Code Playgroud)
这意味着什么,我该如何预防呢?
编辑:是的 - 所有说UGC的人都是对的.实际上,问题不在于引用Web服务,而在于它们无法正常工作.因此,如果您正在设置UGC,请确保(使用您的浏览器)检查OData服务不仅可用,但它们对查询做出正确响应.
如何在给定具有核心服务的结构组TCM URI的情况下获取所有子结构组?
我尝试使用此代码:
ItemsFilterData sgFilter = new RepositoryItemsFilterData
{ ItemTypes = new[] { ItemType.StructureGroup },
Recursive = true,
BaseColumns = ListBaseColumns.Id };
XElement listXml;
using (CoreServiceClient client = _coreServiceProvider.GetCoreServiceClient())
{
listXml = XElement.Parse(
client.ProxyClient.GetListXml(structureGroupUri, sgFilter)
.OuterXml);
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一条错误,上面写着"意外的项目类型:StructureGroup".
我们还有Tridion 2011和页面处理工作流程.我们在页面预保存上有事件处理程序.当用户保存页面时,调用事件处理程序来修改页面元数据并启动工作流程.因此,对于每个编辑器保存点击,页面的次要版本控制将变为0.3.所以基本上:0.1 - 页面的Tridion版本保存0.2 - 为保存页面元数据而执行的事件处理程序代码,并且由于Save()调用,此代码再次被调用以导致下一个次要版本0.3 - 执行相同的事件处理程序代码.
我想要实现的是将每个用户的次要版本保持为0.1保存点击.
我已经尝试过Pre Save Post Save,Pre Check in和Post Check in并更改了执行顺序,即事件系统订阅调用的最后一个参数,但没有任何帮助.所以pl.救命 :)
tridion ×6
.net ×4
tridion-2011 ×4
c# ×3
automapper ×1
events ×1
linq ×1
linq-to-xml ×1
non-greedy ×1
porting ×1
powershell ×1
regex ×1
sed ×1
ugc ×1
version ×1
workflow ×1
xml ×1