Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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上的特定元素_C#_Xml_String - Fatal编程技术网

C# 获取不同XML上的特定元素

C# 获取不同XML上的特定元素,c#,xml,string,C#,Xml,String,我需要从xml字符串中获取一个特定元素,以了解其对应的具体类型对其进行反序列化。让我们调用Function code作为特定元素,获取此元素对我来说有点挑战 每个功能代码对应于一个特定的模式设计,如下所示: 1 <?xml version="1.0" encoding="utf-8"?> 2 <Document xmlns="some.namespace.of.schema.design.1"> 3 <SchemaDesign1> 4

我需要从
xml字符串
中获取一个特定元素,以了解其对应的
具体类型
对其进行反序列化。让我们调用
Function code
作为特定元素,获取此元素对我来说有点挑战

每个
功能代码
对应于一个特定的模式设计,如下所示:

1    <?xml version="1.0" encoding="utf-8"?>
2    <Document xmlns="some.namespace.of.schema.design.1">
3      <SchemaDesign1>
4        <Header>
5          <FunctionCode>FunctionCode1</FunctionCode>
6          <OtherElement1>...</OtherElement1>
7          <OtherElement2>...</OtherElement2>
我只能考虑使用
string.IndexOf(“”
)并获取
函数代码的值,直到它找到相应的结束标记。有没有更好的方法可以在不读取整个字符串的情况下实现这一点

下面是我得到的示例
XML

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:caaa.013.001.07">
    <AccptrDgnstcReq>
        <Hdr>
            <MsgFctn>DGNP</MsgFctn>
            <PrtcolVrsn>6.0</PrtcolVrsn>
            <XchgId>378</XchgId>
            <CreDtTm>2013-08-08T22:18:35.07+02:00</CreDtTm>
            <InitgPty>
                <Id>66000001</Id>
                <Tp>OPOI</Tp>
                <Issr>ACQR</Issr>
            </InitgPty>
            <RcptPty>
                <Id>epas-acquirer-1</Id>
                <Tp>ACQR</Tp>
            </RcptPty>
        </Hdr>
        <DgnstcReq>
            <Envt>
                <Acqrr>
                    <Id>
                    <Id>9287351</Id>
                    </Id>
                    <ParamsVrsn>2013-08-07 08:00:00</ParamsVrsn>
                </Acqrr>
                <MrchntId>
                    <Id>EPASMER001</Id>
                </MrchntId>
                <POIId>
                    <Id>66000001</Id>
                    <Tp>OPOI</Tp>
                    <Issr>ACQR</Issr>
                </POIId>
            </Envt>
        </DgnstcReq>
        <SctyTrlr>
            <CnttTp>AUTH</CnttTp>
            <AuthntcdData>
                <Rcpt>
                    <KEK>
                        <KEKId>
                            <KeyId>SpecV1TestKey</KeyId>
                            <KeyVrsn>2010060715</KeyVrsn>
                            <DerivtnId>OYclpQE=</DerivtnId>
                        </KEKId>
                        <KeyNcrptnAlgo>
                            <Algo>DKP9</Algo>
                        </KeyNcrptnAlgo>
                        <NcrptdKey>4pAgABc=</NcrptdKey>
                    </KEK>
                </Rcpt>
                <MACAlgo>
                    <Algo>MCCS</Algo>
                </MACAlgo>
                <NcpsltdCntt>
                    <CnttTp>DATA</CnttTp>
                </NcpsltdCntt>
                <MAC>3Dahc1K96Pc=</MAC>
            </AuthntcdData>
        </SctyTrlr>
    </AccptrDgnstcReq>
</Document>

DGNP
6
378
2013-08-08T22:18:35.07+02:00
66000001
OPOI
ACQR
epas-收单机构-1
ACQR
9287351
2013-08-07 08:00:00
EPASMER001
66000001
OPOI
ACQR
认证
SpecV1TestKey
2010060715
OYclpQE=
DKP9
4pAgABc=
监控化学品
数据
3Dahc1K96Pc=

因此,假设您有两个
XDocument
,对于每个示例XML,分别称为
doc1
doc2
,那么此代码:

var ns1 = doc1.Root.GetDefaultNamespace();
var ns2 = doc2.Root.GetDefaultNamespace();

var functionCode1 = doc1.Root.Descendants(ns1 + "FunctionCode").First().Value;
var functionCode2 = doc2.Root.Descendants(ns2 + "FunctionCode").First().Value;

Console.WriteLine(functionCode1);
Console.WriteLine(functionCode2);
…产生:

FunctionCode1 FunctionCode2
如果不想将整个字符串转换为
XDocument
,可以使用
XmlReader
并“逐段”解析xml,直到到达
Document\SchemaDesign???\Header\FunctionCode
,或者可以使用
XPathDocument
并通过XPath完成,如
/Document/*/Header/FunctionCode/text()
@xanatos谢谢您的输入,我会尝试的。@KaeL-请提供完整的XML示例(不带行号),以便我们能够编写一个可以测试的解决方案。@Enigmativity-我会尝试模拟一个,但我无法给出完整的一个,因为我有3个XSD,其中2个相当长。@KaeL-当然,你可以给出完整的答案。为什么不呢?谢谢你,我正在尝试。我尝试了你的答案,它正在工作。其他模式的
XML
s应该可以工作,因为它们对于
MsgFctn
具有相同的元素名称。我想知道在这种情况下使用
XDocument
与使用
XmlReader
有何不同。@KaeL-
XmlReader
是pre-LINQ XML工具集的一部分。它对于读取大型XML文档非常有用,因为它不会将所有内容都存储在内存中<另一方面,code>XDocument
,因此在加载大型文档时应谨慎使用<但是,code>XDocument设计用于LINQ,它支持一个更易于理解的模型来遍历XML文档。感谢您的输入。目前,我并不关心收到的XML消息的大小,因为它们不会太大。 FunctionCode1 FunctionCode2
var ns = doc.Root.GetDefaultNamespace();

var functionCode = doc.Root.Descendants(ns + "FunctionCode").First().Value;