标签: xmlreader

XmlReader - 我需要编辑一个元素并生成一个新元素

我重写了一个传入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)

c# xml xmlreader c#-4.0

8
推荐指数
1
解决办法
2万
查看次数

如何从XElement.ReadFrom(XmlReader)创建的XElement对象中删除空格

我正在解析一个大的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 …

xelement whitespace xmlreader

8
推荐指数
1
解决办法
5087
查看次数

防止XmlTextReader扩展实体

我试图在不扩展实体的情况下读取XML文档,对其进行一些操作,并使用未扩展的实体重新保存它们.

直接使用XDocument时,无法加载,抛出异常告诉我它有未展开的实体:

XDocument doc = XDocument.Load(file);  // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);
Run Code Online (Sandbox Code Playgroud)

例外:引用未声明的实体'entityname'.

然后我试图传递XmlTextReaderXDocument构造函数,但该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?

.net xml entity xmlreader linq-to-xml

8
推荐指数
2
解决办法
1854
查看次数

从XmlReader中读取XElement

我正在玩解析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)

.net xmpp xmlreader

8
推荐指数
1
解决办法
6555
查看次数

如何在.NET中强制遵从给定的模式?

假设我有一个模式,我希望输入文档符合该模式.我按照这样的架构加载文件:

// 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)

.net c# schema xmlreader

8
推荐指数
1
解决办法
377
查看次数

System.Xml.XmlException:解析名称时出现意外的文件结尾

我正在使用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中获取)

我的想法到目前为止:

  1. 2048是计算机中非常可疑的数字.我在某处XDocument或某处遇到了2KB的限制XmlReader吗?
  2. 我在循环中的ktXmlReader.Read()以某种方式跳过所有其他节点并直接进入EOF

c# xml linq xmlreader linq-to-xml

8
推荐指数
1
解决办法
2万
查看次数

如何使用XmlReader从XML中的特定子元素获取值?

这是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)

.net c# xml xmlreader

8
推荐指数
2
解决办法
4万
查看次数

如果我处理它的基础流,我是否需要处理XmlReader?

我有以下方法从文件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)

c# dispose xmlreader streamreader

7
推荐指数
2
解决办法
5607
查看次数

我如何克隆MemoryStream对象?

我有一个MemoryStreamStream类型参数传递的对象
(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)

c# memorystream xmlreader stream

7
推荐指数
3
解决办法
1万
查看次数

从Stream读取XML

我正在使用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)

c# xml xmlreader stream

7
推荐指数
2
解决办法
3万
查看次数