解析名称空间不起作用的元素xpath

时间:2014-06-22 17:32:08

标签: c# xml parsing

我不会在我问这个之前就被击落但是我尝试使用名称空间xml,但它仍然不能用于我的xml文档,它来自服务中心maanger。

public void  GetCriteraParamters(string QueryParmeterString, string xpath)
        {
            List<QueryCritera> listCriteraParameter = new List<QueryCritera>();

            XmlDocument currentDocument = new XmlDocument();
            currentDocument.LoadXml(QueryParmeterString);
            string path = xpath;
            XmlNodeList nodeList = currentDocument.SelectNodes(path);
            XmlElement elm = currentDocument.DocumentElement;
            XmlNodeList listCritera= elm.ChildNodes;

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(currentDocument.NameTable);
            nsmgr.AddNamespace("QueryCriteria", "http://Microsoft.EnterpriseManagement.Core.Criteria/");
            var topicNodes = currentDocument.SelectNodes("Expression", nsmgr);

            List<QueryCritera> qp = new List<QueryCritera>();
            string itemSource="";
            for (int i = 0; i < listCritera.Count; i++)
            {
                QueryCritera qpList = new QueryCritera();

                 string myString = listCritera[i].InnerXml.ToString();


                 string  xml2 = XElement.Parse(myString).ToString();

                 XmlDocument currentDocument2 = new XmlDocument();
                 currentDocument2.LoadXml(xml2);
                 XmlNodeList nodeList2 = currentDocument.SelectNodes(xpath);
                 foreach (XmlNode node in nodeList2)
                 {
                     itemSource = node.InnerXml;


                 }

            }


}

我需要能够选择cirtiera下的节点,特别是表达式。

  <?xml version="1.0" encoding="utf-8" ?>
  <View>
  <Data>
    <Adapters>
      <Adapter AdapterName="dataportal:EnterpriseManagementObjectProjectionAdapter">
        <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
        <AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectProjectionAdapter</AdapterType>
      </Adapter>
      <Adapter AdapterName="viewframework://Adapters/AdvancedList">
        <AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>
        <AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter</AdapterType>
      </Adapter>
      <Adapter AdapterName="omsdk://Adapters/Criteria">
        <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
        <AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.SdkCriteriaAdapter</AdapterType>
      </Adapter>
    </Adapters>
    <ItemsSource>
      <AdvancedListSupportClass xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" DataTypeName="" AdapterName="viewframework://Adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectProjectionAdapter" DataSource="mom:ManagementGroup" IsRecurring="True" RecurrenceFrequency="{x:Static s:Int32.MaxValue}" FullUpdateFrequency="1" Streaming="true">
        <AdvancedListSupportClass.Parameters>
          <QueryParameter Parameter="TypeProjectionId" Value="$MPElement[Name='System.WorkItem.Incident.View.ProjectionType']$" />
        </AdvancedListSupportClass.Parameters>
      </AdvancedListSupportClass>
    </ItemsSource>
    <Criteria>
      <QueryCriteria xmlns="http://tempuri.org/Criteria.xsd" Adapter="omsdk://Adapters/Criteria">
          <Criteria>
          <FreeformCriteria>
            <Freeform>
              <Criteria xmlns="http://Microsoft.EnterpriseManagement.Core.Criteria/">
                <Expression>
                  <And>
                    <Expression>
                      <SimpleExpression>
                        <ValueExpressionLeft>
                          <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/TierQueue$</Property>
                        </ValueExpressionLeft>
                        <Operator>Equal</Operator>
                        <ValueExpressionRight>
                          <Value>$MPElement[Name="IncidentTierQueuesEnum.Tier2"]$</Value>
                        </ValueExpressionRight>
                      </SimpleExpression>
                    </Expression>
                    <Expression>
                      <SimpleExpression>
                        <ValueExpressionLeft>
                          <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/Status$</Property>
                        </ValueExpressionLeft>
                        <Operator>NotEqual</Operator>
                        <ValueExpressionRight>
                          <Value>$MPElement[Name="CoreIncident!IncidentStatusEnum.Resolved"]$</Value>
                        </ValueExpressionRight>
                      </SimpleExpression>
                    </Expression>
                    <Expression>
                      <SimpleExpression>
                        <ValueExpressionLeft>
                          <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/Status$</Property>
                        </ValueExpressionLeft>
                        <Operator>NotEqual</Operator>
                        <ValueExpressionRight>
                          <Value>$MPElement[Name="CoreIncident!IncidentStatusEnum.Closed"]$</Value>
                        </ValueExpressionRight>
                      </SimpleExpression>
                    </Expression>
                    <Expression>
                      <UnaryExpression>
                        <ValueExpression>
                          <GenericProperty Path="$Context/Path[Relationship='WorkItem!System.WorkItemAssignedToUser' SeedRole='Source']$">Id</GenericProperty>
                        </ValueExpression>
                        <Operator>IsNull</Operator>
                      </UnaryExpression>
                    </Expression>
                  </And>
                </Expression>
              </Criteria>
            </Freeform>
          </FreeformCriteria>
        </Criteria>
      </QueryCriteria>
    </Criteria>
  </Data>
    <Presentation>
    <Columns>
      <mux:ColumnCollection xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="http://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:datebinding="clr-namespace:Microsoft.EnterpriseManagement.UI.Extensions;assembly=Microsoft.EnterpriseManagement.UI.Extensions">
        <mux:Column Name="id" DisplayMemberBinding="{Binding Path=Id, Mode=OneWay}" Width="150" DisplayName="Header_Id" Property="Id$ReturnValueAsBigInt$" DataType="s:String" />
        <mux:Column Name="title" DisplayMemberBinding="{Binding Path=Title, Mode=OneWay}" Width="200" DisplayName="Header_Title" Property="Title" DataType="s:String" />
        <mux:Column Name="sDisplayName" DisplayMemberBinding="{Binding Path=Status.DisplayName, Mode=OneWay}" Width="100" DisplayName="Header_Status" Property="Status.DisplayName" DataType="s:String" />
        <mux:Column Name="priority" DisplayMemberBinding="{Binding Path=Priority, Mode=OneWay}" Width="100" DisplayName="Header_Priority" Property="Priority" DataType="s:Int32" />
        <mux:Column Name="targetTime" DisplayMemberBinding="{datebinding:DateBinding Path=TargetResolutionTime, Mode=OneWay}" Width="100" DisplayName="Header_Target_Resolution_Time" Property="TargetResolutionTime" DataType="s:DateTime" />
        <mux:Column Name="aDisplayName" DisplayMemberBinding="{Binding Path=AffectedUser.DisplayName, Mode=OneWay}" Width="150" DisplayName="Header_Affected_User" Property="AffectedUser.DisplayName" DataType="s:String" />
        <mux:Column Name="lastModified" DisplayMemberBinding="{Binding Path=$LastModified$, Mode=OneWay}" Width="150" DisplayName="Header_Last_Modified" Property="$LastModified$" DataType="s:DateTime" />
      </mux:ColumnCollection>
    </Columns>
    <ViewStrings>
      <ViewString ID="Header_Id">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Id"]$</ViewString>
      <ViewString ID="Header_Title">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Title"]$</ViewString>
      <ViewString ID="Header_Status">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Status"]$</ViewString>
      <ViewString ID="Header_Priority">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Priority"]$</ViewString>
      <ViewString ID="Header_Target_Resolution_Time">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Target_Resolution_Time"]$</ViewString>
      <ViewString ID="Header_Affected_User">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Affected_User"]$</ViewString>
      <ViewString ID="Header_Last_Modified">$MPElement[Name="System.WorkItem.Incident.Queue.Tier2.Unassigned.View.Header_Last_Modified"]$</ViewString>
    </ViewStrings>
  </Presentation>
  </View>

我希望将这个值推出到我创建的stronlgy类型对象中?。

 <Expression>
              <And>
                <Expression>
                  <SimpleExpression>
                    <ValueExpressionLeft>
                      <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/TierQueue$</Property>
                    </ValueExpressionLeft>
                    <Operator>Equal</Operator>
                    <ValueExpressionRight>
                      <Value>$MPElement[Name="IncidentTierQueuesEnum.Tier2"]$</Value>
                    </ValueExpressionRight>
                  </SimpleExpression>
                </Expression>
                <Expression>
                  <SimpleExpression>
                    <ValueExpressionLeft>
                      <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/Status$</Property>
                    </ValueExpressionLeft>
                    <Operator>NotEqual</Operator>
                    <ValueExpressionRight>
                      <Value>$MPElement[Name="CoreIncident!IncidentStatusEnum.Resolved"]$</Value>
                    </ValueExpressionRight>
                  </SimpleExpression>
                </Expression>
                <Expression>
                  <SimpleExpression>
                    <ValueExpressionLeft>
                      <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/Status$</Property>
                    </ValueExpressionLeft>
                    <Operator>NotEqual</Operator>
                    <ValueExpressionRight>
                      <Value>$MPElement[Name="CoreIncident!IncidentStatusEnum.Closed"]$</Value>
                    </ValueExpressionRight>
                  </SimpleExpression>
                </Expression>
                <Expression>
                  <UnaryExpression>
                    <ValueExpression>
                      <GenericProperty Path="$Context/Path[Relationship='WorkItem!System.WorkItemAssignedToUser' SeedRole='Source']$">Id</GenericProperty>
                    </ValueExpression>
                    <Operator>IsNull</Operator>
                  </UnaryExpression>
                </Expression>
              </And>
            </Expression>

1 个答案:

答案 0 :(得分:0)

将XmlDocument与包含名称空间的xml一起使用时,需要使用XmlNamespaceManager为这些名称空间创建别名。在XPath语句中,您可以在元素名称前面使用别名。试一试:

XmlDocument doc = new XmlDocument();
doc.Load("XMLFile1.xml");

// Give the namespace an alias that we will use in our XPath statement
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("a", "http://Microsoft.EnterpriseManagement.Core.Criteria/");

// Find any Criteria node tagged with the "a" namespace
XmlNode node = doc.SelectSingleNode("//a:Criteria", mgr);

Console.WriteLine(node.OuterXml);
相关问题