Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有名称空间前缀的xml的XPath表达式_C#_.net_Xpath_Biztalk_Biztalk 2013 - Fatal编程技术网

C# 带有名称空间前缀的xml的XPath表达式

C# 带有名称空间前缀的xml的XPath表达式,c#,.net,xpath,biztalk,biztalk-2013,C#,.net,Xpath,Biztalk,Biztalk 2013,给定以下xml: <ns0:MCCI_IN000002UV01 xmlns:ns0="urn:hl7-org:v3"> <ns0:id root="2.16.840.1.113883.3.277.100.1" extension="68423f2b-397a-4de4-8b8d-ea1f6c174954" /> <ns0:creationTime>201410171106-0700</ns0:creationTime> &l

给定以下xml:

<ns0:MCCI_IN000002UV01 xmlns:ns0="urn:hl7-org:v3">
    <ns0:id root="2.16.840.1.113883.3.277.100.1" extension="68423f2b-397a-4de4-8b8d-ea1f6c174954" />
    <ns0:creationTime>201410171106-0700</ns0:creationTime>
    <ns0:versionCode code="Ballot2009May" />
    <ns0:interactionId root="2.16.840.1.113883.1.6" extension="MCCI_IN000002UV01" />
    <ns0:processingCode code="P" />
    <ns0:processingModeCode code="T" />
    <ns0:receiver nullFlavor="NA">
        <ns0:device nullFlavor="NA" classCode="DEV" determinerCode="INSTANCE">
            <ns0:id nullFlavor="NA" />
        </ns0:device>
    </ns0:receiver>
    <ns0:sender nullFlavor="NA">
        <ns0:device nullFlavor="NA" classCode="DEV" determinerCode="INSTANCE">
            <ns0:id nullFlavor="NA" />
        </ns0:device>
    </ns0:sender>
    <ns0:acknowledgement typeCode="CA">
        <ns0:targetMessage>
            <ns0:id root="2.16.840.1.113883.3.277.100.1" extension="adb32b05-bf62-4417-8c62-d37a65380c4f" />
        </ns0:targetMessage>
        <ns0:acknowledgementDetail typeCode="I" />
    </ns0:acknowledgement>
</ns0:MCCI_IN000002UV01>
然后,我使用XPathExpression创建我的XPathCollection:

XPathCollection xc = new XPathCollection();
xc.NamespaceManager = new XmlNamespaceManager(xr.NameTable);
xc.NamespaceManager.AddNamespace("hl7", "urn:hl7-org:v3");
xc.Add(new XPathExpression("hl7:MCCI_IN000002UV01/hl7:versionCode/@code"));
我将XPathCollection和XmlReader实例传递给BizTalk XPathMutatorStream对象:

XPathMutatorStream str = new XPathMutatorStream(xr, xc, ...);

如果xml上没有名称空间前缀,这一切都很好,但是一旦有了,我就永远不会得到任何匹配。是否需要在命名空间管理器上或在实际的xpath语句中执行某些操作以获得匹配?

如果要使用Linq2Xml:

var xDoc = XDocument.Load(filename);
1-使用XPath

XmlNamespaceManager mgr = new XmlNamespaceManager(xDoc.CreateNavigator().NameTable);
mgr.AddNamespace("hl7", "urn:hl7-org:v3");

var version = xDoc.XPathSelectElement("hl7:MCCI_IN000002UV01/hl7:versionCode", mgr);
var code = version.Attribute("code").Value;
2-使用Linq

XNamespace h17 = "urn:hl7-org:v3";
var code2 = xDoc.Descendants(h17 + "versionCode").First().Attribute("code").Value;

是否尝试使用local-name()函数


例如://*[local-name()='MCCI_in00002uv01']/*[local-name()='versionCode']/@code

为了使它更健壮,我建议包括namespace-uri()。我尝试了这个方法/*[local-name()='MCCI_in00002uv01'和namespace-uri()='urn:hl7 org:v3']/*[local-name()='versionCode']/@code为什么要使用“/*.”而不是“/*”?我不确定,但我怀疑“/*”符号是否适用于XPathMutatorStream。查看本文以了解更多信息以及XPathMutatorStream上的优缺点:我可以让这些都发挥作用。理想情况下,我不会使用其中任何一个,因为它们涉及将整个XML加载到内存中。XPathMutatorStream不需要将整个数据集加载到XDocument或XmlDocument中,因此内存占用较少,这在消息可能较大或并发性可能较高的代理(BizTalk)场景中可能非常重要。
XmlNamespaceManager mgr = new XmlNamespaceManager(xDoc.CreateNavigator().NameTable);
mgr.AddNamespace("hl7", "urn:hl7-org:v3");

var version = xDoc.XPathSelectElement("hl7:MCCI_IN000002UV01/hl7:versionCode", mgr);
var code = version.Attribute("code").Value;
XNamespace h17 = "urn:hl7-org:v3";
var code2 = xDoc.Descendants(h17 + "versionCode").First().Attribute("code").Value;