2014-04-09 162 views
1

嘗試使用C#通過XmlReader查詢XML,但獲取錯誤原因命名空間別名。 XML文件非常大(< 1,6GB),並且別名和名稱空間可能因文件而異。使用命名空間別名/前綴查詢XmlReader的問題

在下面我試着找到「MsgHead」標籤,但該例子中,由於有一個別名(< * MH: * MsgHead>)查詢不檢測的標籤。由於名稱空間和別名不能選擇硬編碼別名和名稱空間。

是否有任何選項可以忽略名稱空間別名?

XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<mh:MsgHead xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
     xmlns:mh="http://www.kith.no/xmlstds/msghead/2006-05-24" 
     xmlns:n1="http://www.altova.com/samplexml/other-namespace" 
     xsi:schemaLocation="http://www.kith.no/xmlstds/msghead/2006-05-24 MsgHead-v1_2.xsd"> 
<mh:MsgInfo> 
    <mh:Type DN="xxx" V="xxx"/> 
    <mh:MIGversion>v1.2 2006-05-24</mh:MIGversion> 
    <mh:GenDate>2014-04-01T20:53:08</mh:GenDate> 
    <mh:MsgId>xxx</mh:MsgId> 
    <mh:ProcessingStatus DN="Produksjon" V="P"/> 
    <mh:RequestedPriority DN="Normal" V="N"/> 
    <mh:Ack DN="Ja" V="J"/> 
    <mh:Sender> 
    <mh:ComMethod DN="EDI" V="EDI"/> 
    <mh:Organisation> 
<mh:OrganisationName>xxxx</mh:OrganisationName> 
<mh:Ident> 
<mh:Id>69</mh:Id> 
<mh:TypeId S="xxx" DN="HER-id" V="HER"/> 

C#代碼:

string meldingsType = "N/A"; 
XmlReaderSettings settings = new XmlReaderSettings(); 
settings.CheckCharacters = false; 
XmlReader xmlLeser = XmlReader.Create(fil, settings); 
while (xmlLeser.Read()) 
{ 
    if ((xmlLeser.NodeType == XmlNodeType.Element) && (xmlLeser.Name == "MsgHead")) 
    { 
     meldingsType = "Hodemelding"; 
     break; 
    } 
+0

爲什麼你使用像XmlReader這樣的低級工具?你有沒有嘗試LINQ到XML? –

+0

由於該文件非常大,並且XmlReader未將該文件加載到內存中。但是,沒有我沒有嘗試使用LINQ到XML,主要是因爲我不熟悉LINQ。 – kaareol

+0

您應該熟悉LINQ to XML。 'XNamespace mh =「http://www.kith.no/xmlstds/msghead/2006-05-24」; var msgHead = doc.Element(mh +「MsgHead」);' –

回答

2

不檢查某個命名空間前綴。前綴無關緊要,重要的是元素的本地名稱和命名空間URI。

+0

那是正確的。我將.Name更改爲.LocalName,問題就解決了。 檢查鏈接: http://stackoverflow.com/questions/15139979/select-node-without-namespace-with-xpath – kaareol