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;