我有一个PHP脚本,它试图解析一个巨大的XML文件.为此,我正在使用XMLReader库.在解析过程中,我有这个编码错误:
输入不正确UTF-8,表示编码!字节:0xA0 0x32 0x36 0x30
我想知道它们是否是一种跳过带有坏字符的记录的方法.
谢谢!
我想使用XMLReader读取XML文件,但在解析期间,每个元素都会调用两次END ELEMENT.
<publications>
<article id="Xu86oazdn">
<title>Learning</title>
<authors>
<author>
<firstname>Michel</firstname>
<lastname>Browsky</lastname>
</author>
</authors>
</article>
</publications>
Run Code Online (Sandbox Code Playgroud)
这是解析作者条目的一段代码:
<?php
$xml = new XMLReader();
$xml->open("php://stdin");
$author = null;
while($xml->read()) {
switch($xml->nodeType) {
case XMLReader::ELEMENT:
switch($xml->name) {
case 'author':
echo("+" . $xml->name);
break;
}
case XMLReader::END_ELEMENT:
switch($xml->name) {
case 'author':
echo("-" . $xml->name);
break;
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
但奇怪的是,每个调用END_ELEMENT两次</author>,如echo消息所示:
+author
-author
-author
Run Code Online (Sandbox Code Playgroud)
如果我通过调用替换echo消息$xml->readOuterXML(),则第一个END_ELEMENT如下:
<author>
<firstname>Michel</firstname>
<lastname>Browsky</lastname>
</author>
Run Code Online (Sandbox Code Playgroud)
第二个是以下内容:
<author/>
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?我是否以错误的方式使用END_ELEMENT?检测末端元素的正确方法是什么?
我有一个问题,阅读格式化的空元素<eanCode/>.在此元素之后,XmlReader类无法读取下一个元素.
<EanCode/><Stock>15</Stock>
if ($reader->nodeType == XMLReader::ELEMENT) {
switch ($reader->name) {
case 'Stock':
$reader->read();
$stock = $reader->value;
ECHO 'stokkk adet = '. $stock;
break;...
Run Code Online (Sandbox Code Playgroud)
所以,我决定<eanCode/>用<eanCode></eanCode>.但是编写算法很困难.有人可以提供相应的preg替换方法吗?
我的 PHP 信息是这样的:
Configure Command : '--with-libxml-dir=/usr'
'--enable-xml'
'--disable-xmlreader'
'--disable-xmlwriter'
Run Code Online (Sandbox Code Playgroud)
即我的xmlwriter&xmlreader在安装过程中尚未启用。
Run Code Online (Sandbox Code Playgroud)libxmllibXML 支持活动
libXML 编译版本 2.7.8
libXML 加载版本 20708
启用 libXML 流
运行时配置
此扩展没有在php.ini中定义的配置指令。
如何启用 XMLReader?/ 我是否必须使用 --enable-xmlreader 再次编译 PHP?
由于某些原因,我将不去讨论,因此无法将对象类型用作webapi控制器的参数。因此,我需要找到一种使用XmlDocument或类似方法将xml对象反序列化为c#对象的方法。
这是我到目前为止的内容:
public void Post(HttpRequestMessage request)
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(request.Content.ReadAsStreamAsync().Result);
using (XmlReader xmlReader = new XmlNodeReader(xmlDoc))
{
Object obj = new XmlSerializer(typeof(myObject)).Deserialize(xmlReader);
myObject scp = (myObject)obj;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这引发了错误。谁能提供一些关于如何将xml反序列化到对象中的建议?
tia
编辑:这是我要反序列化的xml:
<Student>
<studentid>1234</studentid>
<command>post</command>
<posttype>charge</posttype>
<transaction_description>This is a test post to the web api</transaction_description>
<payment_type>CC</payment_type>
<term_code>2013SPRING</term_code>
<amount>432.75</amount>
</Student>
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
System.InvalidOperationException:意外。产生日期:2014年3月19日,星期三,格林尼治标准时间
System.InvalidOperationException:XML文档(1、2)中存在错误。---> System.InvalidOperationException:意外。-在Microsoft.Xml.Serialization.GeneratedAssembly 。 .API.StudentInformationPostController.Post(HttpRequestMessage请求)位于System.Web上lambda_method(Closure,Object,Object [])的C:\ Projects \ CashNetSSO \ Development \ CashNetSSO \ CashNetSSO \ Controllers \ API \ StudentInformationPostController.cs:第23行。 Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor。<> c_ DisplayClassf.b
。 .Serialization.XmlSerializer.Deserialize(Stream stream)
_9(Object实例,对象[] …
我对使用C#的XML类比较陌生.我甚至无法让XML阅读器识别出我传递给它的字符串是XML.这是我用于测试基本Xml读数的单元测试
[TestFixture()]
public class LegacyWallTests
{
[Test()]
public void ReadLegacyWallFile()
{
var legacyWallText = legacyfiles.legacywall1;
{
string xmlString = legacyfiles.legacywall1;
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
reader.HasAttributes.Should().BeTrue();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试阅读的XML
<Wall>
<Actual>
<Specifications>
<Insertion> 375.6858 916.8871 0.0000 </Insertion>
<Angle> 3.14159 </Angle>
<WallDesc> E4-1, H: 8' 1 1/8, Sh: Yes, S: 2~4~2~9-0-0~SPF~~, Spc: Single @ 16 in OC, BP: 2~4~2~12-0-0~SYP~~, CP: 2~4~2~12-0-0~SYP~~, TP: 2~4~2~12-0-0~SYP~~,\P LI: Single @ 38.75000000, CB: No, VB: No, NCT: 2~4~2~9-0-0~SPF~~, CT: 2~4~2~9-0-0~SPF~~, Pac: 2~4~2~9-0-0~SPF~~, …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
public String[] readXML(String filename)
{
XmlReader xmlReader = XmlReader.Create(@filename);
List<String> names = new List<string>();
String[] keywords = null;
while (xmlReader.Read())
{
//Keep reading
if (xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))
{
// get attribute from the Xml element here
string keywords = xmlReader.GetAttribute("name");
names.Add(keywords);
String[] keywordsArray = names.ToArray();
}
else
{
MessageBox.show("An Error Occured");
}
}
return keywordsArray;
}
Run Code Online (Sandbox Code Playgroud)
这会吗?有人可以测试一下吗?
我不想使用XMLDocument,因为我使用XMLWriter编写了XML编写代码.因此,没有理由切换.
<Player>
<Friends />
<Ignores>
<Ignore>117779</Ignore>
<Ignore>44237636758361374</Ignore>
<Ignore>564534831</Ignore>
</Ignores>
<InventoryItems>
<Item>
<Slot>0</Slot>
<Id>995</Id>
<Amount>39493</Amount>
</Item>
<Item>
<Slot>27</Slot>
<Id>1049</Id>
<Amount>12</Amount>
</Item>
</InventoryItems>
<BankItems />
</Player>
Run Code Online (Sandbox Code Playgroud)
我正在尝试解析那里.这是我到目前为止所得到的.似乎在任何地方打破了我有点工作<Ignore>'s但是当我使用ReadToFollowing而不是ReadToNextSibling,它会工作,直到ReadToFollowing击中一个空行..它只会达到EOF.
XmlTextReader reader = new XmlTextReader(misc.getServerPath() + "\\accounts\\" + username + ".xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "Friends") {
if (!reader.IsEmptyElement) //got any friends
{
while (reader.ReadToFollowing("Friend"))
//do_stuff_with_that_data(reader.ReadElementContentAsLong());
}
} else if (reader.NodeType == XmlNodeType.Element && reader.Name == "Ignores") {
if (!reader.IsEmptyElement) //got any ignores …Run Code Online (Sandbox Code Playgroud) 我本周收到了一个复杂的XML文件,它基于模式,但我没有收到任何xsd文件,我需要读取这个文件的每个节点.
下面的XML示例:
<xc:XmlTest xmlns:xc="XmlTest" xmlns:mp="bs.TestParameters" xmlns:rt="bs.TestParameters.Parameter1" xmlns:rtcu="bs.TestParameters.Parameter1.Var">
<xc:XmlTestArea xc:value="TestParameters">
<mp:Name xc:Value="raddesso" xmlns:mp="bs.TestParameters">
<mp:Date xc:Value="20130215">
<rt:RunTest xmlns:rt="bs.TestParameters.Parameter1">
<rtcu:Var xmlns:rtcu="bs.TestParameters.Parameter1.Var">
<mp:FinalValue>1234</mp:FinalValue>
</rtcu:Var>
</rt:RunTest>
</mp:Date>
<mp:Date xc:Value="20130216">
<rt:RunTest xmlns:rt="bs.TestParameters.Parameter1">
<rtcu:Var xmlns:rtcu="bs.TestParameters.Parameter1.Var">
<mp:FinalValue>23234</mp:FinalValue>
</rtcu:Var>
</rt:RunTest>
</mp:Date>
</mp:Name>
</xc:XmlTestArea>
</xc:XmlTest>
Run Code Online (Sandbox Code Playgroud)
这只是使用虚假数据的真实文件的示例.
有没有办法在这个节点上做foreach从每个日期找到FinalValue?
我有一种方法可以并行加载并运行报表布局。所有报告将使用相同的baselayout.xml。由于线程每次尝试访问同一资源时都会因异常而失败,因此我使用了a lock来锁定文件。
public static XmlTextReader LoadReport(string reportName)
{
object _locker = new object();
object reportData;
lock (_locker)
{
reportData = Resources.ResourceManager.GetObject(reportName);
}
return new XmlTextReader(new MemoryStream((byte[])reportData));
}
Run Code Online (Sandbox Code Playgroud)
并行方法如下所示:
private void RunReportsParallel(List<ReportObject> coverterList)
{
try
{
Parallel.ForEach(coverterList, (currentObject) => {
currentObject.Convert();
});
}
catch (Exception e)
{
smlLogger.Error(Helper.SetLogLine(e.Message, processId));
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
Conver将运行以下代码:
public override SectionReport GetMainReport()
{
SectionReport mainReport = new SectionReport();
XMLDataSource datasource = new XMLDataSource(null, "//AkontoRechnung");
datasource.LoadXML(rechnungsdaten.ToString());
mainReport = new ReportAkontorechnung(datasource, reportConfiguration, Language, NoPrintOut);
try …Run Code Online (Sandbox Code Playgroud) 什么是阅读XML的最佳方式?
我的xml就像我会有很多
<A> and <B>, not sure how many will be there and I have to read the whole xml file.
Run Code Online (Sandbox Code Playgroud)
我不能说子元素喜欢
<180> will be there under <A> for sure. So does the other element.
Run Code Online (Sandbox Code Playgroud)
但如果它在那里我必须阅读它.
我应该使用LINQ或XPath还是XMLReader?哪一个更好更容易?
<A>
<180>20130218</180> ///180 is here
<170>5</170>
<220>20080210</220>
<730 CLID='AAA' KW='BBB' KW2='INTERNATIONAL'>
<731>BBB INTERNATIONAL AG</731>
<732>XXX</732>
<735>US66</735>
<734>YYY</734>
</730>
<300>
<301>
<320>20071100</320>
<310>12345</310>
</301>
<330>US</330>
</300>
</A>
<A> ///180 is not here
<170>5</170>
<220>20080210</220>
<730 CLID='AAA' KW='BBB' KW2='WORLD'>
<731>BBB INTERNATIONAL AG</731>
<734>YYY</734>
</730> …Run Code Online (Sandbox Code Playgroud) 考虑我的源文件看起来像这样。
<Content xmlns="uuid:4522eb85-0a47-45f9-8e2b-1x82c78xx920">
<first>Hello World.This is Fisrt field</first>
<second>Hello World.This is second field</second>
</Content>
Run Code Online (Sandbox Code Playgroud)
我想编写一段代码,从某个位置读取此 xml 文档并将其显示为字符串。
say name of the xml file is helloworld.xml.
Location: D:\abcd\cdef\all\helloworld.xml.
Run Code Online (Sandbox Code Playgroud)
我已经尝试过以下操作,但我无法做到。
XmlDocument contentxml = new XmlDocument();
contentxml.LoadXml(@"D:\abcd\cdef\all\helloworld.xml");
Response.Write("<BR>" + contentxml.ToString());
Run Code Online (Sandbox Code Playgroud)
Response.write 不显示任何内容。如果我错过了什么,请纠正我。它没有创建任何组件并且错误即将到来。
我也尝试过这个,
XmlDocument contentxml = new XmlDocument();
try
{
contentxml.LoadXml(@"D:\abcd\cdef\all\helloworld.xml");
}
catch (XmlException exp)
{
Console.WriteLine(exp.Message);
}
StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
contentxml.WriteTo(xw);
Response.Write("<BR>" + sw.ToString());
Run Code Online (Sandbox Code Playgroud)
但我没有找到任何输出。
我想从某个位置读取 XML 文件并将其显示为字符串。
任何人都可以帮忙解决这个问题吗?
谢谢你,穆齐米尔。