【问题标题】:Parse XAML using XDocument class C#使用 XDocument 类 C# 解析 XAML
【发布时间】:2017-07-10 12:44:03
【问题描述】:

我正在尝试使用 XDocument 类获取工作流标记,但它给了我下面提到的异常:

名称中不能包含“:”字符,十六进制值 0x3A。

我也尝试过使用命名空间,但没有取得积极的结果。

XML:

  <?xml version="1.0" encoding="utf-16"?>
        <Activity x:Class="XrmWorkflow75328ae32924499d972dd68053611740" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:mxswa="clr-namespace:Microsoft.Xrm.Sdk.Workflow.Activities;assembly=Microsoft.Xrm.Sdk.Workflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xmlns:s="clr-namespace:System;assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" xmlns:this="clr-namespace:" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
            <mxswa:Workflow>
                <mxswa:ActivityReference AssemblyQualifiedName="Microsoft.Crm.Workflow.Activities.ConditionSequence, Microsoft.Crm.Workflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" DisplayName="ConditionStep1: name">
</mxswa:ActivityReference>
            </mxswa:Workflow>
        </Activity>

代码:

 string strXml = File.ReadAllText(@"../../XMLFile1.xml");
            XDocument xdoc = XDocument.Parse(strXml);
              XNamespace xmlns = "clr-namespace:Microsoft.Xrm.Sdk.Workflow.Activities;assembly‌​=Microsoft.Xrm.Sdk.W‌​orkflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35";
        var results = from node in xdoc.Descendants( xmlns + "Workflow")
                      select node;

结果始终为空。

【问题讨论】:

  • 您的示例 xml 中没有 Arguments 节点
  • 您的mxswa:ActivityReference 节点没有结束标记。
  • 请再次检查问题已被编辑

标签: c# xml linq-to-xml


【解决方案1】:

我正在尝试获取工作流标签

正如@Sergey Berezovskiy 所说,您需要使用XNamespace

这是完整的工作示例。

var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
    <Activity x:Class=""XrmWorkflow75328ae32924499d972dd68053611740"" xmlns=""http://schemas.microsoft.com/netfx/2009/xaml/activities"" xmlns:mxswa=""clr-namespace:Microsoft.Xrm.Sdk.Workflow.Activities;assembly=Microsoft.Xrm.Sdk.Workflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"" xmlns:s=""clr-namespace:System;assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" xmlns:this=""clr-namespace:"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
        <mxswa:Workflow>
            <mxswa:ActivityReference AssemblyQualifiedName=""Microsoft.Crm.Workflow.Activities.ConditionSequence, Microsoft.Crm.Workflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"" DisplayName=""ConditionStep1: name"" />
        </mxswa:Workflow>
    </Activity>";

XDocument xdoc = XDocument.Parse(xml);
XNamespace xnamespace = "clr-namespace:Microsoft.Xrm.Sdk.Workflow.Activities;assembly=Microsoft.Xrm.Sdk.Workflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35";
var nodes = xdoc.Descendants(xnamespace + "Workflow");

【讨论】:

    【解决方案2】:

    这是在元素名称中使用命名空间的正确方法:

    xdoc.Descendants(xmlns + "ActivityReference.Arguments")
    

    即它的 XNamespace 加上本地名称字符串。

    注意:您的示例 xml 中没有 mxswa:ActivityReference.Arguments 节点,并且您的 mxswa:ActivityReference 没有结束标记。

    【讨论】:

    • 您的代码不起作用。你检查过它是否工作?
    • @ShujaatSiddiqui 您需要使用完整的命名空间,否则它将无法工作。 clr-namespace:Microsoft.Xrm.Sdk.Workflow.Activities;assembly=Microsoft.Xrm.Sdk.Workflow, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
    • @ShujaatSiddiqui 有效,使用正确的xmlns:mxswa
    • @SergeyBerezovskiy 是的,它正在工作,但我必须使用完整的命名空间
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多