मुझे एक ही समस्या है और स्पष्ट रूप से कोई आसान समाधान नहीं है।
तो मैं दो केवल पढ़ने के लिए FileStream में हेरफेर करने का फैसला किया: XmlReader के लिए एक, प्रत्येक पंक्ति की स्थिति प्राप्त करने के लिए अन्य:
private void ReadXmlWithLineOffset()
{
string malformedXml = "<test>\n<test2>\r <test3><test4>\r\n<test5>Thi is\r\ra\ntest</test5></test4></test3></test2>";
string fileName = "test.xml";
File.WriteAllText(fileName, malformedXml);
XmlTextReader xr = new XmlTextReader(new FileStream(fileName, FileMode.Open, FileAccess.Read));
FileStream fs2 = new FileStream(fileName, FileMode.Open, FileAccess.Read);
try
{
int currentLine = 1;
while(xr.Read())
{
if (!string.IsNullOrEmpty(xr.Name))
{
for (;currentLine < xr.LineNumber; currentLine++)
ReadLine(fs2);
Console.WriteLine("{0} : LineNum={1}, FileOffset={2}", xr.Name, xr.LineNumber, fs2.Position);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception : " + ex.Message);
}
finally
{
xr.Close();
fs2.Dispose();
}
}
private void ReadLine(FileStream fs)
{
int b;
while ((b = fs.ReadByte()) >= 0)
{
if (b == 10) // \n
return;
if (b == 13) // \r
{
if (fs.ReadByte() != 10) // if not \r\n, go back one byte
fs.Seek(-1, SeekOrigin.Current);
return;
}
}
}
यह नहीं यह कर, क्योंकि यह दो का उपयोग करता है का सबसे अच्छा तरीका है पाठकों। इससे बचने के लिए, हम XmlReader और लाइन काउंटर के बीच साझा किए गए एक नए फ़ाइल रीडर को फिर से लिख सकते हैं। लेकिन यह आपको बस उस लाइन की ऑफसेट देता है जिसमें आप रुचि रखते हैं। टैग की सटीक ऑफसेट प्राप्त करने के लिए, हमें लाइनपॉजिशन का उपयोग करना चाहिए, लेकिन यह एन्कोडिंग के कारण मुश्किल हो सकता है।
स्रोत
2010-05-06 14:28:23
क्या आपको इसके साथ कोई सफलता मिली है? मैं कुछ ऐसा करना चाहता हूं (कुछ तत्वों की धारा ऑफ़सेट की गणना करें, फिर बाद में उस ऑफसेट और पार्स की तलाश करें), और अब तक मैं सबसे अच्छा देख सकता हूं कि ऑफ़सेट की गणना करने के लिए फ़ाइल को दो बार पार्स करना है। – Rob
@ रोब नोप। मैं प्रत्येक बार दस्तावेज़ को संसाधित करने के लिए XmlReader/XmlWriter का उपयोग कर समाप्त हुआ। वे मेरे उद्देश्य के लिए पर्याप्त तेज़ हैं कि मैं इस अनुकूलन को छोड़ सकता हूं। – dmo