我通過使用下面的代碼讀取5GB大小的巨大的XML文件得到XML值,我是成功拿到第一個元素Testid
但未能獲得另一個元素TestMin
不同的命名空間 這是在即將到來我有xml如何通過LINQ的
which i am getting as null
。這裏有什麼不對?
編輯 GMileys答案給像The ':' character, hexadecimal value 0x3A, cannot be included in a name
我通過使用下面的代碼讀取5GB大小的巨大的XML文件得到XML值,我是成功拿到第一個元素Testid
但未能獲得另一個元素TestMin
不同的命名空間 這是在即將到來我有xml如何通過LINQ的
which i am getting as null
。這裏有什麼不對?
編輯 GMileys答案給像The ':' character, hexadecimal value 0x3A, cannot be included in a name
實際上命名空間是罪魁禍首,我所做的是第一次加載小部分我得到from.Readform方法中的XDocument,然後我刪除了所有的命名空間,然後我拿着價值。簡單:)
什麼對這種做法的錯誤?
XDocument doc = XDocument.Load(path);
XName utranCellName = XName.Get("UtranCell", "un");
XName qRxLevMinName = XName.Get("qRxLevMin", "es");
var cells = doc.Descendants(utranCellName);
foreach (var cell in cells)
{
string qRxLevMin = cell.Descendants(qRxLevMinName).FirstOrDefault();
// Do something with the value
}
元素es:qRxLevMin
是xn:attributes
一個子元素,但它看起來像你想選擇它作爲xn:vsDataContainer
一個孩子,這是該元素的孫子。你可以嘗試改變以下:
var dataqrxlevmin = from atts in pin.ElementsAfterSelf(xn + "VsDataContainer")
select new
{
qrxlevmin = (string)atts.Element(es + "qRxLevMin"),
};
要這樣:
var dataqrxlevmin = from atts in pin.Elements(string.Format("{0}VsDataContainer/{1}attributes", xn, es))
select new
{
qrxlevmin = (string)atts.Element(es + "qRxLevMin"),
};
注:我改變了你的字符串連接使用string.Format
爲了提高可讀性,無論是在技術上是蠻好用的,但string.Format
是一個更好的做法。
讓我試試這個 – peter
得到的異常像:字符十六進制值,不能包含在名字中 – peter
你在哪裏得到那個異常?嘗試寫出或添加一個手錶到你的變量。設置一個局部變量來代替內聯傳遞:'string elementPath = string.Format(「{0}:VsDataContainer/{1}:attributes」,xn,es);''Console.WriteLine(elementPath) ;'''var dataqrxlevmin = from pin.Elements(elementPath)...'atts。通過每個路徑字符串來確保您使用的是正確的XPath。 – gmiley
試試這個代碼,它非常類似於你的代碼,但更簡單。
using (XmlReader xr = XmlReader.Create(path))
{
xr.MoveToContent();
XNamespace un = xr.LookupNamespace("un");
XNamespace xn = xr.LookupNamespace("xn");
XNamespace es = xr.LookupNamespace("es");
while (!xr.EOF)
{
if(xr.LocalName != "UtranCell")
{
xr.ReadToFollowing("UtranCell", un.NamespaceName);
}
if(!xr.EOF)
{
XElement utranCell = (XElement)XElement.ReadFrom(xr);
}
}
}
5GB文件,我將得到一個內存超出例外 – peter