我重写了一个传入XmlReader的方法,我需要找到一个特定的元素,添加一个属性,然后创建一个新的XmlReader或者用修改后的内容替换现有的XmlReader.我正在使用C#4.0
我已经使用XElement(Linq)进行了调查,但我似乎无法操纵现有元素并添加属性和值.
我知道XmlWriter有WriteAttributeString,这将是太棒了但是我不知道它是如何组合在一起的
我希望能够做到这样的事情---这是伪代码!
public XmlReader DoSomethingWonderful(XmlReader reader)
{
Element element = reader.GetElement("Test");
element.SetAttribute("TestAttribute","This is a test");
reader.UpdateElement(element);
return reader;
}
Run Code Online (Sandbox Code Playgroud) 我正在解析一个大的xml文件.所以我使用XmlReader结合XElement而不是XElement.Load().
我已经从XmlReader中的XElement对象创建的,如下所示,并在这里.
static IEnumerable<XElement> StreamRootChildDoc(string uri)
{
using (XmlReader reader = XmlReader.Create(uri, xmlReaderSettings))
{
reader.MoveToContent();
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name == "Child")
{
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想将此XElement对象内容作为字符串保存在数据库中而不使用空格.以下3种方式都不起作用.请注意,如果我使用XElement.Load()在内存中加载xml,则ToString(SaveOptions.DisableFormatting)可以正常工作.
<root> <child></child> </root> //xml saved in db with whitespace
<root><child></child></root> //want to save as this
XElement.ToString(SaveOptions.DisableFormatting) //
XElement.ToString(SaveOptions.None)
XElement.ToString()
Run Code Online (Sandbox Code Playgroud)
我用于XmlReader对象的XmlReaderSettings如下所示.我尝试IgnoreWhitespace …
我试图在不扩展实体的情况下读取XML文档,对其进行一些操作,并使用未扩展的实体重新保存它们.
直接使用XDocument时,无法加载,抛出异常告诉我它有未展开的实体:
XDocument doc = XDocument.Load(file); // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);
Run Code Online (Sandbox Code Playgroud)
例外:引用未声明的实体'entityname'.
然后我试图传递XmlTextReader给XDocument构造函数,但该EntityHandling属性没有"不扩展":
XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);
Run Code Online (Sandbox Code Playgroud)
另外,我查看了XmlReader.Create函数,但MSDN说:"Create方法创建的读者扩展了所有实体".
如何创建不扩展实体的XmlReader,或者具有未扩展实体的XDocument?
我正在玩解析XMPP XML流.关于XML流的棘手问题是,开始标记直到会话结束才会关闭,即从未收到完整的DOM.
<stream:stream>
<features>
<starttls />
</features>
....
network session persists for arbitrary time
....
</stream:stream>
Run Code Online (Sandbox Code Playgroud)
我需要从流中读取XML元素,而不必担心根元素尚未关闭.
理想情况下,这可以工作,但它没有,我假设它是因为读者正在等待根元素被关闭.
XElement someElement = XNode.ReadFrom(xmlReader) as XElement;
Run Code Online (Sandbox Code Playgroud)
下面的代码(我借用Jacob Reimers)确实有效,但我希望有一种更有效的方法,不涉及创建新的XmlReader并进行字符串解析.
XmlReader stanzaReader = xmlReader.ReadSubtree();
stanzaReader.MoveToContent();
string outerStanza = stanzaReader.ReadOuterXml();
stanzaReader.Close();
XElement someElement = XElement.Parse(outerStanza);
Run Code Online (Sandbox Code Playgroud) 假设我有一个模式,我希望输入文档符合该模式.我按照这样的架构加载文件:
// Load the ABC XSD
var schemata = new XmlSchemaSet();
string abcSchema = FooResources.AbcTemplate;
using (var reader = new StringReader(abcSchema))
using (var schemaReader = XmlReader.Create(reader))
{
schemata.Add(string.Empty, schemaReader);
}
// Load the ABC file itself
var settings = new XmlReaderSettings
{
CheckCharacters = true,
CloseInput = false,
ConformanceLevel = ConformanceLevel.Document,
IgnoreComments = true,
Schemas = schemata,
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings
};
XDocument inputDoc;
try
{
using (var docReader = XmlReader.Create(configurationFile, settings))
{
inputDoc = XDocument.Load(docReader);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用XmlReader检索使用SqlCommand.ExecuteXmlReader.
当我运行这行代码时:
XDocument currentXDoc = XDocument.Load(ktXmlReader.ReadSubtree());
Run Code Online (Sandbox Code Playgroud)
它是第一次工作,按预期读取第一个Product节点.
第二次运行时,我得到以下异常:
System.Xml.XmlException:
Message: Unexpected end of file while parsing Name has occurred. Line 1, position 2048.
Stacktrace: at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseQName(Boolean isQName, Int32 startOffset, Int32& colonPos)
at System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NodeData startTag)
at System.Xml.XmlTextReaderImpl.ParseEndElement()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlSubtreeReader.Read()
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o)
at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
Run Code Online (Sandbox Code Playgroud)
我确实发现了这个问题,这个问题与我的相似,但我很确定我的XML格式正确(我可以直接从运行的sproc中获取)
我的想法到目前为止:
XDocument或某处遇到了2KB的限制XmlReader吗?这是XML字符串.
<?xml version="1.0" encoding="utf-16"?>
<questionresponses>
<question id="dd7e3bce-57ee-497a-afe8-e3d8d25e2671">
<text>Question 1?</text>
<response>abcdefg</response>
<correctresponse>123</correctresponse>
</question>
<question id="efc43b1d-048f-4ba9-9cc0-1cc09a7eeaf2">
<text>Question 2?</text>
<response>12345678</response>
<correctresponse>123</correctresponse>
</question>
</questionresponses>
Run Code Online (Sandbox Code Playgroud)
那么如何<response>通过给定的问题ID 获得元素的价值呢?再说了,如果我给的值id ="dd7e3bce-57ee-497A-afe8-e3d8d25e2671",我想有字符串值abcdefg返回结果.
var xmlstr = "content from above xml example";
using (var reader = XmlReader.Create(new StringReader(xmlstr)))
{
while(reader.Read())
{
if(reader.IsStartElement())
{
var attr = reader["id"];
if(attr != null && attr == "dd7e3bce-57ee-497a-afe8-e3d8d25e2671")
{
if(reader.ReadToDescendant("response"))
{
result = reader.Value; // <= getting empty string? So what's wrong?
break;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下方法从文件GetData创建一个StreamReader.
private void GetData(string file)
{
string filename = Path.GetFileNameWithoutExtension(file);
XmlDocument xmldoc = new XmlDocument();
using (StreamReader sr = new StreamReader(file))
{
Stream bs = sr.BaseStream;
Stream cl = mainParser.CleanMarkup(bs);
try
{
xmldoc = mainParser.LoadDocument(bs);
}
catch (XmlException ex)
{
// Exceptions are usually caused by non-compliant documents.
// These errors are not critical to the operation of this program.
Console.WriteLine(filename + " " + ex.Message);
}
}
Msdn msdnParser = new Msdn(xmldoc);
ListViewItem lvitem = …Run Code Online (Sandbox Code Playgroud) 我有一个MemoryStream由Stream类型参数传递的对象
(Stream在C#中是抽象类).
我想克隆他,并创建另一个MemoryStream对象与原始的当前位置的一面,并创建一个新XMLReader的,所以我将能够阅读其内容.
这就是我所做的,它不起作用(调试标有//* - >的行newReader有{None}值)
假设:你在一个方法内并有Stream currentStream参考.
var x = new XmlReaderSettings();
x.IgnoreWhitespace = true;
using (var newMemoryStream = new MemoryStream())
{
stream.CopyTo(newMemoryStream);
using (var newReader = XmlReader.Create(newMemoryStream,x)) //*
{
Doing some stuff...
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用ASP.NET,并从表单导入XML文件.现在我将其转换为Stream:
Stream inputStream = XmlFileUploadControl.PostedFile.InputStream;
Run Code Online (Sandbox Code Playgroud)
因为我以后可能需要这个版本.
我想首先检查以确保XML文件具有正确的格式,如果是,则显示一些信息:
if (CorrectFileFormat(inputStream))
{
DisplayLicenseInfo(inputStream);
}
else
{
StatusLabel.Text = "Selected file is not a LicensingDiag XML file";
}
Run Code Online (Sandbox Code Playgroud)
该CorrectFileFormat()方法:
protected Boolean CorrectFileFormat(Stream inputStream)
{
XmlReader reader = XmlReader.Create(inputStream);
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "DiagReport")
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
该DisplayLicenseInfo()方法:
protected void DisplayLicenseInfo(Stream inputStream)
{
XmlReader reader = XmlReader.Create(inputStream);
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "LicensingStatus")
{
StatusLabel.Text += ("Licensing Status: " + reader.ReadString() …Run Code Online (Sandbox Code Playgroud) xmlreader ×10
c# ×7
xml ×5
.net ×4
linq-to-xml ×2
stream ×2
c#-4.0 ×1
dispose ×1
entity ×1
linq ×1
memorystream ×1
schema ×1
streamreader ×1
whitespace ×1
xelement ×1
xmpp ×1