我想调用XmlSerializer.Deserialize它来传递它XDocument.它可以采取a Stream,a XmlReader或a TextReader.
我可以生成上面的一个XDocument而不实际转储XDocument到一些中间存储,例如MemoryStream?
似乎我所追求的是一个XmlReader适用于它的实现XDocument.我找不到一个.
我希望能够使用声明和UTF-8编码将XML写入String.这似乎很难完成.
我已经阅读了一些并尝试了一些流行的答案,但他们都有问题.我当前的代码正确输出为UTF-8但不保持XDocument的原始格式(即缩进/空格)!
有人可以提供一些建议吗?
XDocument xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), xelementXML);
MemoryStream ms = new MemoryStream();
using (XmlWriter xw = new XmlTextWriter(ms, Encoding.UTF8))
{
xml.Save(xw);
xw.Flush();
StreamReader sr = new StreamReader(ms);
ms.Seek(0, SeekOrigin.Begin);
String xmlString = sr.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
XML要求格式化与格式化格式相同,.ToString()即
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
<node>blah</node>
</root>
Run Code Online (Sandbox Code Playgroud)
我现在看到的是
<?xml version="1.0" encoding="utf-8" standalone="yes"?><root><node>blah</node></root>
Run Code Online (Sandbox Code Playgroud)
更新
我已经设法通过添加XmlTextWriter设置让这个工作...虽然看起来非常笨重!
MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Indent = true;
using (XmlWriter xw …Run Code Online (Sandbox Code Playgroud) <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SetNationalList xmlns="http://www.lge.com/ddc">
<nationalList>
<portnumber>6000</portnumber>
<slaveaddress>7000</slaveaddress>
<flagzone>2</flagzone>
<flagindivisual>5</flagindivisual>
<flagdimming>3</flagdimming>
<flagpattern>6</flagpattern>
<flaggroup>9</flaggroup>
</nationalList>
</SetNationalList>
</s:Body>
</s:Envelope>
Run Code Online (Sandbox Code Playgroud)
XDocument xdoc = XDocument.Parse(xml);
foreach (XElement element in xdoc.Descendants("nationalList"))
{
MessageBox.Show(element.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我想遍历每个节点,nationalList但它不适合我,它foreach完全跳过循环.我在这做错了什么?
我正在修改由另一方创作的一些XHTML文件.作为这项工作的一部分,我正在通过Linq到XML进行批量编辑.
我刚刚注意到一些原始的源XHTML文件在这些文件中的文本节点中包含"HTML实体.例如:
<p>Greeting: "Hello, World!"</p>
Run Code Online (Sandbox Code Playgroud)
而当通过XElement.ToString()恢复XHTML文本时,"实体将被普通的双引号替换:
<p>Greeting: "Hello, World!"</p>
Run Code Online (Sandbox Code Playgroud)
问题:任何人都可以告诉我原作者使用"实体而不是普通双引号的动机是什么?这些实体是否达到了我不完全理解的目的?或者,我怀疑他们真的没必要吗?
我确实理解"在某些情况下是必要的,例如当需要在HTML属性中放置双引号时.例如:
<a href="/images/hello_world.jpg" alt="Greeting: "Hello, World!"">
Greeting</a>
Run Code Online (Sandbox Code Playgroud) 我正在使用以下内容在C#应用程序中加载XML文档:
XDocument xd1 = new XDocument();
xd1 = XDocument.Load(myfile);
Run Code Online (Sandbox Code Playgroud)
但在此之前,我会测试以确保文件存在:
File.Exists(myfile);
Run Code Online (Sandbox Code Playgroud)
但是......是否有一种(简单)方法在XDocument.Load()之前测试文件以确保它是一个有效的XML文件?换句话说,我的用户可能会意外地在文件浏览器中单击另一个文件并尝试加载,例如,.php文件会导致异常.
我能想到的唯一方法是将它加载到StreamWriter中并简单地对前几个字符进行文本搜索,以确保它们"
谢谢!
-Adeena
如何使用LINQ从XDocument获取XML元素?
假设我有一个名为XMLDoc的XDocument,如下所示:
<Contacts>
<Node>
<ID>123</ID>
<Name>ABC</Name>
</Node>
<Node>
<ID>124</ID>
<Name>DEF</Name>
</Node>
</Contacts>
XElement Contacts = from xml2 in XMLDoc.Elements("Contacts").Elements("Node")
where xml2.Element("ID").Value == variable
select xml2;
Run Code Online (Sandbox Code Playgroud)
但我得到错误"对象参考不是设置....."
如何使用LINQ从XML文件中获取特定节点?我想更新该节点中的一些值?
怎么可能????
提前致谢.........
我有一个简单的XElement对象
XElement xml = new XElement("XML",
new XElement ("TOKEN",Session["Token"]),
new XElement("ALL_INCLUSIVE", "0"),
new XElement("BEACH", "0"),
new XElement("DEST_DEP", ddlDest.SelectedValue.ToString()),
new XElement("FLEX", "0")
);
Run Code Online (Sandbox Code Playgroud)
想要将内容转储成字符串的地方.完全一样Console.Writeline(xml);,但我希望字符串中的内容.我试过各种各样的方法.xml.ToString();不会自行返回任何东西.
什么是XPath(在C#API中XDocument.XPathSelectElements(xpath,nsman),如果重要的话)查询此文档中的所有MyNode?
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<MyNode xmlns="lcmp" attr="true">
<subnode />
</MyNode>
</configuration>
Run Code Online (Sandbox Code Playgroud)
/configuration/MyNode这是错误的,因为它忽略了命名空间./configuration/lcmp:MyNode哪个是错的,因为lcmp是URI,而不是前缀./configuration/{lcmp}MyNode哪个失败了因为Additional information: '/configuration/{lcmp}MyNode' has an invalid token.编辑:我不能mgr.AddNamespace("df", "lcmp");像一些回答者所建议的那样使用.这要求XML解析程序知道我计划提前使用的所有命名空间.由于这适用于任何源文件,我不知道手动添加前缀的命名空间.它似乎{my uri}是XPath语法,但微软并没有打算实现那个......是真的吗?
我想创建一个这样的XML文档:

我想使用代码和LINQ-to-XML从头开始创建它.在加载事件的形式我写了这段代码:
private void Form9_Load(object sender, EventArgs e)
{
doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
XElement myroot = new XElement("Employees");
doc.Add(myroot);
}
Run Code Online (Sandbox Code Playgroud)
如何向员工添加新人,如果我想在特定位置插入人员,我该怎么办?
我如何删除或更新特定的人?
所以让我们假设这是我想要实现的:
<root>
<name>AAAA</name>
<last>BBBB</last>
<children>
<child>
<name>XXX</name>
<last>TTT</last>
</child>
<child>
<name>OOO</name>
<last>PPP</last>
</child>
</children>
</root>
Run Code Online (Sandbox Code Playgroud)
不确定使用XElement是否是最简单的方法,
但这是我到目前为止所做的:
XElement x = new XElement("root",
new XElement("name", "AAA"),
new XElement("last", "BBB"));
Run Code Online (Sandbox Code Playgroud)
现在我必须根据我的一些数据添加"孩子".
可能有1,2,3,4 ......
所以我需要通过我的列表进行迭代以获得每个孩子
foreach (Children c in family)
{
x.Add(new XElement("child",
new XElement("name", "XXX"),
new XElement("last", "TTT"));
}
Run Code Online (Sandbox Code Playgroud)
这样我就会错过"CHILDREN Parent节点".如果我只是在foreach之前添加它,它将被渲染为一个封闭的节点
<children/>
Run Code Online (Sandbox Code Playgroud)
这不是我们想要的.
如何将第一部分添加到父节点并添加到我的列表中?